javaJDBC資料庫連線池基本思想
基本思想:
•資料庫連線池的基本思想就是為資料庫連線建立一個“緩衝池”。預先在緩衝池中放入一定數量的連線,當需要建立資料庫連線時,只需從“緩衝池”中取出一個,使用完畢之後再放回去。
•資料庫連線池負責分配、管理和釋放資料庫連線,它允許應用程式重複使用一個現有的資料庫連線,而不是重新建立一個。
•資料庫連線池在初始化時將建立一定數量的資料庫連線放到連線池中,這些資料庫連線的數量是由最小資料庫連線數來設定的。無論這些資料庫連線是否被使用,連線池都將一直保證至少擁有這麼多的連線數量。連線池的最大資料庫連線數量限定了這個連線池能佔有的最大連線數,當應用程式向連線池請求的連線數超過最大連線數量時,這些請求將被加入到等待佇列中。
資料庫連線池技術的優點:
•資源重用
–由於資料庫連線得以重用,避免了頻繁建立,釋放連線引起的大量效能開銷。在減少系統消耗的基礎上,另一方面也增加了系統執行環境的平穩性。
•更快的系統反應速度
–資料庫連線池在初始化過程中,往往已經建立了若干資料庫連線置於連線池中備用。此時連線的初始化工作均已完成。對於業務請求處理而言,直接利用現有可用連線,避免了資料庫連線初始化和釋放過程的時間開銷,從而減少了系統的響應時間
•新的資源分配手段
–對於多應用共享同一資料庫的系統而言,可在應用層通過資料庫連線池的配置,實現某一應用最大可用資料庫連線數的限制,避免某一應用獨佔所有的資料庫資源
•統一的連線管理,避免資料庫連線洩露
–在較為完善的資料庫連線池實現中,可根據預先的佔用超時設定,強制回收被佔用連線,從而避免了常規資料庫連線操作中可能出現的資源洩露
DBCP 資料庫連線池
•DBCP 是 Apache軟體基金組織下的開源連線池實現,該連線池依賴該組織下的另一個開源系統:Common-pool. 如需使用該連線池實現,應在系統中增加如下兩個 jar 檔案:
–Commons-dbcp.jar:連線池的實現
–Commons-pool.jar:連線池實現的依賴庫 http://commons.apache.org/proper/commons-dbcp/download_dbcp.cgi http://commons.apache.org/proper/commons-pool/download_pool.cgi
/**
* 使用 DBCP 資料庫連線池
* 1. 加入 2 個jar 包(commons-dhcp,commons-pools). 依賴於 Commons Pool
* 2. 建立資料庫連線池
* 3. 為資料來源例項指定必須的屬性
* 4. 從資料來源中獲取資料庫連線
* @throws SQLException
*/
@Test
public void testDBCP() throws SQLException {
final BasicDataSource dataSource = new BasicDataSource();
// 2、為資料來源例項指定必須的屬性
dataSource.setUsername("root");
dataSource.setPassword("root123456");
dataSource.setUrl("jdbc:mysql://127.0.0.1:3306/zcj");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
// 3、指定資料來源的一些可選屬性
// 3.1、指定資料庫連線池中出使化連線數的個數
dataSource.setInitialSize(5);
// 3.2、指定最大連線數:同意時刻可以同時向資料庫申請的連線數
dataSource.setMaxActive(5);
// 3.3、指定最小連線數:在資料庫連線池中儲存的最少的空閒連線的數量
dataSource.setMinIdle(2);
// 3.4、等待資料庫連線池分配連線的最長時間。單位為毫秒。超出時間將丟擲異常
dataSource.setMaxWait(1000 * 5);
// 4、從資料來源中獲取資料庫連線
Connection connection = dataSource.getConnection();
System.out.println(connection.getClass());
connection = dataSource.getConnection();
System.out.println(connection.getClass());
connection = dataSource.getConnection();
System.out.println(connection.getClass());
connection = dataSource.getConnection();
System.out.println(connection.getClass());
Connection connection2 = dataSource.getConnection();
System.out.println(">"+connection2.getClass());
new Thread(){
public void run(){
Connection conn;
try {
conn=dataSource.getConnection();
System.out.println(conn.getClass());
} catch (SQLException e) {
e.printStackTrace();
}
}
}.start();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
connection2.close();
}