13.數據庫連接池
/*使用數據庫連接池優化程序性能*/
一次性從數據庫中拿出一定數量的連接,放到一個池子中,每次程序要拿連接的時候,從這個池子裏面去拿,用完了,也是放到這個池子裏,
避免頻繁的從數據庫中去存取連接
編寫自己的數據庫連接池
1.實現DataSource接口 ,DataSource接口中定義了兩個重載的getConnection() 方法
2.在DataSource構造函數中批量創建與數據庫的連接,並把創建的連接加入LinkedList對象中
實現getConnection()方法,讓getConnection()方法每次調用時,從LinkedList中取一個connection (remove方法) 返回給用戶
3.當用戶使用完connection,調用connection.close() 方法時,connection對象應保證自己返回到LinkedList中,而不要把connection 還給數據庫
針對 “返回到LinkedList中,而不要把connection 還給數據庫” 這種需要增強某個方法,有三種方式實現
1.編寫一個子類(繼承Connection) 覆蓋close方法 (這裏不可以,因為父類的其他信息,子類並不擁有)
2.寫一個Connection包裝類,增強close方法 (包裝設計模式)
3.用動態代理,返回一個代理對象出去,攔截close方法的調用,對close方法進行增強
(不是clsoe方法,都調用invoke方法(讓其調用connection自身的方法),是close方法的話,手動增強)
/*用包裝設計模式對某個對象進行增強*/
1.寫一個類,實現與被增強對象(mysql的connection)接口
2.定義一個變量,指向被增強對象
3.定義一個構造方法,接收被增強對象
4.覆蓋想增強的方法
5.對於不想增強的方法,直接調用被增強對象的方法
/*加入dbcp鏈接池*/
1.導入jar包
2.在類目錄下加入dbcp的配置文件
3.在jdbcUtils靜態代碼塊中創建池
/*C3P0數據庫連接池*/
1.導入jar包
2.新建c3p0Test.java單元測試類
3.打開c3p0的doc幫助文檔
4.選擇QuickStart快速開始
5.拷貝裏邊的實例代碼
6.修改各個參數
采用配置文件配置數據源
1.打開幫助文檔
2.找到XML文件示例
3.在工程中新建c3p0-config.xml文件
4.拷貝XML示例文件,修改參數 ( <property></property> )
private static ComboPooledDataSource ds = null;
static {
try {
ds = new ComboPooledDataSource("...");(如果括號為空,沒有指定的話,則采用默認)
}
}
/*配置Tomcat數據源(實際上是DBCP)*/
1.在Tomcat中加入數據庫驅動軟件(放在web工程中的lib 中沒有用,需要放在Tomcat的lib目錄下)
2.配置context(可以在很多地方,可以修改tomcat的service.xml文件,也可以在web工程中)
META-INF目錄下,新建一個XML文件,拷貝Tomcat幫助文檔中的示例代碼
3.使用JNDI獲取連接對象
Context initCtx = new InitialContext(); //初始化JNDI
Context envCtx = (Context) initCtx.lookup("java:comp/env"); //得到JNDI容器
DataSource ds = (DataSource) envCtx.lookup("jdbc/EmployeeDB"); //從容器中檢索連接池
Connection conn = ds.getConnection();
13.數據庫連接池