一.介紹
連接池是創(chuàng)建和管理一個連接的緩沖池的技術改备,這些連接準備好被任何需要它們的線程使用。
在實際應用開發(fā)中,特別是在WEB應用系統(tǒng)中,如果JSP冻晤、Servlet或EJB使用JDBC直接訪問數(shù)據(jù)庫中的數(shù)據(jù),每一次數(shù)據(jù)訪問請求都必須經(jīng)歷建立數(shù)據(jù)庫連接拟淮、打開數(shù)據(jù)庫疯溺、存取數(shù)據(jù)和關閉數(shù)據(jù)庫連接等步驟,而連接并打開數(shù)據(jù)庫是一件既消耗資源又費時的工作绞铃,如果頻繁發(fā)生這種數(shù)據(jù)庫操作镜雨,系統(tǒng)的性能必然會急劇下降,甚至會導致系統(tǒng)崩潰儿捧。數(shù)據(jù)庫連接池技術是解決這個問題最常用的方法荚坞,在許多應用程序服務器(例如:Weblogic,WebSphere,JBoss)中挑宠,基本都提供了這項技術,無需自己編程西剥,但是痹栖,深入了解這項技術是非常必要的。
數(shù)據(jù)庫連接池技術的思想非常簡單瞭空,將數(shù)據(jù)庫連接作為對象存儲在一個Vector對象中揪阿,一旦數(shù)據(jù)庫連接建立后,不同的數(shù)據(jù)庫訪問請求就可以共享這些連接咆畏,這樣南捂,通過復用這些已經(jīng)建立的數(shù)據(jù)庫連接,可以克服上述缺點旧找,極大地節(jié)省系統(tǒng)資源和時間溺健。
二.知識點介紹
1、連接池規(guī)范
2钮蛛、編寫工具類
3鞭缭、常見配置項
三.上課視頻對應說明文檔
1、連接池規(guī)范
Java為數(shù)據(jù)庫連接池提供了公共的接口:javax.sql.DataSource魏颓,各個廠商需要讓自己的連接池實現(xiàn)這個接口岭辣。這樣應用程序可以方便的切換不同廠商的連接池。
常見的連接池:DBCP甸饱、C3P0沦童。這里學習DBCP連接池。
1.1叹话、連接池技術簡述
當多個程序(多個用戶)有多個需求時偷遗,我們需要創(chuàng)建多個Connection對象,而與數(shù)據(jù)庫創(chuàng)建連接是十分消耗資源的驼壶,連接池創(chuàng)建了多個連接氏豌,當使用連接操作數(shù)據(jù)時,會分配一個連接热凹,而這個連接也可供其他程序(用戶)的數(shù)據(jù)庫操作使用箩溃,類似線程池。
javax.sql包下的 DataSource是線程池接口碌嘀』林迹可以使用getConnection()方法獲取一個連接,如果連接對象Connection是通過連接池獲取的股冗,當通過Connection對象調用close()方法時霹陡,不再是銷毀連接對象,而是將連接對象放回到連接池。
不使用連接池
使用連接池
(1)dbcp連接池介紹
DBCP 是 Apache 軟件基金組織下的一個優(yōu)秀的開源連接池實現(xiàn)烹棉,使用DBCP數(shù)據(jù)源攒霹,應用程序應在系統(tǒng)中增加如下兩個 jar 文件:
Commons-dbcp.jar:連接池的實現(xiàn)
Commons-pool.jar:連接池實現(xiàn)的依賴庫
Tomcat的連接池正是采用該連接池來實現(xiàn)的。該數(shù)據(jù)庫連接池既可以與應用服務器整合使用浆洗,也可由應用程序獨立使用催束。
(2)dbcp連接池配置
//導包加入classpath
// 1.創(chuàng)建連接池對象
BasicDataSource ds = new BasicDataSource();
// 2.設置相關屬性
ds.setDriverClassName("com.mysql.jdbc.Driver");
ds.setUrl("xxx");
ds.setUsername("xxx");
ds.setPassword("xxx");
(3)DBUtils使用連接池
當擁有了連接池后,我們可以直接使用連接池獲取連接對象伏社,完成普通的sql操作抠刺。(在獲取連接后,關閉連接是將連接返還給連接池)
而在DBUtils的學習過程中摘昌,我們使用QueryRunner的空參構造完成速妖,每次請求調用query方法時傳入連接對象。
而當有了線程池后聪黎,可以調用QueryRunner的帶參構造創(chuàng)建對象:
QueryRunner(DataSource connectionPool);
這時罕容,在每次訪問數(shù)據(jù)庫時,將無需再傳入連接對象稿饰。因為在每次使用QueryRunner時锦秒,都已經(jīng)通過連接池獲取了連接。
如:
BasicDataSource ds = new BasicDataSource();
ds.setUrl("jdbc:mysql://localhost:3306/javahelp_gjp");//設置數(shù)據(jù)庫連接
ds.setDriverClassName("com.mysql.jdbc.Driver");//設置驅動名稱
ds.setUsername("root");//設置登錄用戶名
ds.setPassword("abc");//設置登錄密碼
ds.setMaxIdle(3);//連接池最大空閑連接個數(shù)
ds.setMaxWait(3000);//連接池最大等待時間
ds.setMaxActive(5);//連接池最大連接個數(shù)
ds.setInitialSize(3);//連接池初始化連接個數(shù)
QueryRunner qr = new QueryRunner(ds);
//再查詢時無需傳入連接對象喉镰,因為QueryRunner對象已經(jīng)從連接池中獲取了連接
返回值類型? query = qr.query(SQL語句,Handler對象);
2旅择、編寫工具類(最簡單方式)
/*
* 創(chuàng)建DBCP連接池工具類
*
* 作用: 配置DBCP連接池,提供獲取連接池中連接對象的方法
*/
public class DBCPUtils {
//創(chuàng)建連接池
private static BasicDataSource dataSource = new BasicDataSource();
public static final String DRIVER_CLASS_NAME = "com.mysql.jdbc.Driver";
public static final String URL = "jdbc:mysql://localhost:3306/day22_jdbc";
public static final String USER_NAME = "root";
public static final String PASSWORD = "root";
//通過靜態(tài)代碼塊梧喷,完成dataSource對象的信息配置
static {
//指定驅動名稱
dataSource.setDriverClassName(DRIVER_CLASS_NAME);
//指定數(shù)據(jù)庫URL
dataSource.setUrl(URL);
//指定數(shù)據(jù)庫連接的用戶名
dataSource.setUsername(USER_NAME);
//指定數(shù)據(jù)庫連接的密碼
dataSource.setPassword(PASSWORD);
}
/*
* 提供獲取連接池中連接對象的方法
*/
public static Connection getConnection(){
try{
return dataSource.getConnection();
}catch (Exception e) {
throw new RuntimeException(e);
}
}
}
3、常見配置項
參考文檔: http://commons.apache.org/proper/commons-dbcp/configuration.html