單例模式是設(shè)計(jì)模式中最簡(jiǎn)單的形式之一婿失。這一模式的目的是使得類的一個(gè)對(duì)象成為系統(tǒng)中的唯一實(shí)例钞艇。
* 餓漢模式
public class HungrySingle {
// 內(nèi)部自己創(chuàng)建好實(shí)例,私有屬性(不建議在外部直接調(diào)用我們的成員變量)
? ? private static final HungrySingle sInstance = new HungrySingle();
//私有的構(gòu)造方法
? ? private HungrySingle() {
? ? }
//創(chuàng)建一個(gè)方法豪硅,使外部可以得到此實(shí)例
? ? public static HungrySingle getInstance() {
? ? ? ? return sInstance;
? ? }
}
* 懶漢模式
public class LazySingle {
//創(chuàng)建私有實(shí)例
? ? private static LazySingle sInstance = null;
//定義私有的構(gòu)造 哩照,禁止外部直接創(chuàng)建示例
? ? private LazySingle() {
? ? }
//創(chuàng)建方法,使外部可以調(diào)用我們的私有對(duì)象實(shí)例
? ? public static LazySingle getInstance() {
? ? ? ? if (sInstance == null) {
//加上synchronized保證對(duì)象的訪問的線程安全
? ? ? ? ? ? synchronized (LazySingle.class) {
? ? ? ? ? ? ? ? ? ? sInstance = new LazySingle();
? ? ? ? ? ? }
? ? ? ? }
? ? ? ? return sInstance;
? ? }
}
//餓漢式:
? ? ? ? public class Singleton{
? ? ? ? ? ? private static Singleton singleton = new Singleton ();
? ? ? ? ? ? private Singleton (){}
? ? ? ? ? ? public static Singleton getInstance(){return singletion;}
? ? ? }
//懶漢式:
? ? ? public class Singleton{
? ? ? ? ? ? private static Singleton singleton = null;
? ? ? ? ? ? public static synchronized Singleton getInstance(){
? ? ? ? ? ? ? ? if(singleton==null){
? ? ? ? ? ? ? ? ? ? singleton = new Singleton();
? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? return singleton;
? ? ? ? ? ? }
? ? ? }
數(shù)據(jù)源:
數(shù)據(jù)源(DataSource)用來連接數(shù)據(jù)庫懒浮,創(chuàng)建連接(Connection)對(duì)象飘弧。
java.sql.DataSource接口負(fù)責(zé)建立與數(shù)據(jù)庫的連接
由Tomcat提供,將連接保存在連接池中砚著。
連接池:
連接池是由容器(比如Tomcat)提供的次伶,用來管理池中的連接對(duì)象。
連接池自動(dòng)分配連接對(duì)象并對(duì)閑置的連接進(jìn)行回收稽穆。
連接池中的連接對(duì)象是由數(shù)據(jù)源(DataSource)創(chuàng)建的冠王。
連接池(Connection Pool)用來管理連接(Connection)對(duì)象。
JNDI(Java Naming and Directory Interface,Java命名和目錄接口):
在程序中使用JNDI獲取數(shù)據(jù)源舌镶。
通過數(shù)據(jù)源創(chuàng)建的連接對(duì)象被統(tǒng)一的放入到連接池中進(jìn)行管理柱彻。
搞清楚三者的關(guān)系豪娜,然后進(jìn)行下面的配置 : )
連接池的配置:
C3P0連接池在Spring的配置文件application.xml的配置:
<!-- 配置C3P0連接池: -->
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
? <property name="driverClass" value="${jdbc.driver}"/>
? <property name="jdbcUrl" value="${jdbc.url}"/>
? <property name="user" value="${jdbc.user}"/>
? <property name="password" value="${jdbc.password}"/>
</bean>
數(shù)據(jù)源的配置與使用數(shù)據(jù)源的方法:
1、配置Tomcat的conf/context.xml
<Resource name="jdbc/news"
? ? ? ? ? ? ? auth="Container"? type="javax.sql.DataSource"? maxActive="100"
? ? ? ? ? ? ? maxIdle="30" maxWait="10000" username="root"? password="root"
? ? ? ? ? ? ? driverClassName="com.mysql.jdbc.Driver"
? ? ? ? ? ? ? url="jdbc:mysql://127.0.0.1:3306/news"/>
? name=指定Resource的JNDI名稱
? auth=指定管理Resource的Manager(Container由容器創(chuàng)建和管理哟楷,Application由Web應(yīng)用創(chuàng)建和管理)
? type=指定Resource的java類
? maxActive=指定連接池中處于活動(dòng)狀態(tài)的數(shù)據(jù)庫連接的最大數(shù)量
? maxIdle=指定連接池中處于空閑狀態(tài)的數(shù)據(jù)庫的最大數(shù)量
? maxWait=指定連接池中連接處于空閑的最長(zhǎng)時(shí)間侵歇,超過這個(gè)時(shí)間會(huì)提示異常,取值為-1吓蘑,表示可以無限期等待惕虑,單位為毫秒(ms)
這里不要忘記:還需要將數(shù)據(jù)庫的驅(qū)動(dòng)jar包添加到,Tomcat安裝目錄下的lib文件夾中磨镶。
2溃蔫、使用JNDI獲取連接對(duì)象
lookup(java:comp/env/數(shù)據(jù)源名稱");
//java:comp/env/這是Java的語法要求,必須寫上琳猫。
//這里的數(shù)據(jù)源名稱就是上面的jdbc/news伟叛,這個(gè)news是項(xiàng)目名。
3.編寫代碼獲取數(shù)據(jù)源
? // 獲取數(shù)據(jù)庫連接
? public Connection getConnection2() {
? try {
? ? //初始化上下文
? ? Context cxt=new InitialContext();
? ? //獲取與邏輯名相關(guān)聯(lián)的數(shù)據(jù)源對(duì)象
? ? DataSource ds=(DataSource)cxt.lookup("java:comp/env/jdbc/news");
? ? conn=ds.getConnection();
? } catch (NamingException e) {
? ? // TODO Auto-generated catch block
? ? e.printStackTrace();
? } catch (SQLException e) {
? ? // TODO Auto-generated catch block
? ? e.printStackTrace();
? }
? return conn;
? }
還有一點(diǎn)要注意:測(cè)試連接是否成功脐嫂,需要在jsp頁面輸出connection统刮,而不是在java類中Run As,應(yīng)為數(shù)據(jù)源配置在Tomcat中需要把Web項(xiàng)目放入Tomcat容器中運(yùn)行账千。jsp頁面代碼如下:
示例:
<%
BaseDao baseDao=new BaseDao();
Connection connection=baseDao.getConnection2();
%>
<%=connection %>
在Tomcat中的配置
配置在:context.xml文件內(nèi)
F:\apache-tomcat-7.0.68-windows-x64\apache-tomcat-7.0.68\conf\context.xml
---------mySQL
<Resource name="jdbc/news"
auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30" maxWait="10000" username="root"
password="Admin001"
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://127.0.0.1:3306/news"/>
----------Oracle
<Resource name="jdbc/orcl"
auth="Container" type="javax.sql.DataSource"
maxActive="100"
maxIdle="30" maxWait="10000" username="wuyong"
password="Admin001"
driverClassName="oracle.jdbc.OracleDriver"
url="jdbc:oracle:thin:@localhost:1521:orcl"/>
使用JNDI獲取連接對(duì)象
java:comp/env/jdbc/news
這段為固定寫法
java:comp/env/