標籤:資料庫連接池 dbcp c3p0 java
C3P0是一個開源的JDBC串連池,它實現了資料來源和JNDI綁定,支援JDBC3規範和JDBC2的標準擴充。目前使用它的開源項目有Hibernate,Spring等。C3P0資料來源在項目開發中使用得比較多。
1、c3p0與dbcp區別
dbcp沒有自動回收空閑串連的功能
c3p0有自動回收空閑串連功能
c3p0支援更加多的資料庫連接池選項。
2、匯入相關jar包
c3p0-0.9.0.jar
3、C3P0參數詳解
datasource.c3p0.acquireIncrement=10當串連池中的串連用完時,C3P0一次性建立新串連的數目;
datasource.c3p0.minPoolSize=50串連池中保留的最小串連數。預設為15
datasource.c3p0.maxPoolSize=400串連池中保留的最大串連數。預設為15;
datasource.c3p0.initialPoolSize=50初始化時建立的串連數,應在minPoolSize與maxPoolSize之間取值。預設為3;
datasource.c3p0.maxIdleTime=1800最大空閑時間,超過空閑時間的串連將被丟棄。為0或負數則永不丟棄。預設為0;
datasource.c3p0.acquireRetryAttempts=100定義在從資料庫擷取新串連失敗後重複嘗試擷取的次數,預設為30;
datasource.c3p0.acquireRetryDelay=20兩次串連中間隔時間,單位毫秒,預設為1000;
datasource.c3p0.debugUnreturnedConnectionStackTraces=true
datasource.c3p0.maxStatements=0JDBC的標準參數,用以控制資料來源內載入的PreparedStatement數量。但由於預緩衝的Statement屬 於單個Connection而不是整個串連池。所以設定這個參數需要考慮到多方面的因素,如果maxStatements與 maxStatementsPerConnection均為0,則緩衝被關閉。預設為0;
datasource.c3p0.idleConnectionTestPeriod=1800隔多少秒檢查所有串連池中的空閑串連,預設為0表示不檢查;
datasource.c3p0.breakAfterAcquireFailure=true擷取串連失敗將會引起所有等待擷取串連的線程拋出異常。但是資料來源仍有效保留,並在下次調 用getConnection()的時候繼續嘗試擷取串連。如果設為true,那麼在嘗試擷取串連失敗後該資料來源將申明已斷開並永久關閉。預設為 false;
datasource.c3p0.testConnectionOnCheckout=false因效能消耗大請只在需要的時候使用它。如果設為true那麼在每個connection提交的時候都 將校正其有效性。建議使用idleConnectionTestPeriod或automaticTestTable
datasource.c3p0.autoCommitOnClose=true串連關閉時預設將所有未提交的操作復原。預設為false;
datasource.c3p0.maxStatementsPerConnection=100串連池內單個串連所擁有的最大緩衝Statement數。預設為0;
4、利用C3PO實現資料庫連接池的原始碼
package com.db;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import com.mchange.v2.c3p0.ComboPooledDataSource;
/**
*利用C3P0開源工具,簡單建立資料庫連接池
*@author 範芳銘
*/
public class EasyC3p0 {
privatestatic ComboPooledDataSource ds = null;
//在靜態代碼塊中建立資料庫連接池
static{
try{
//通過代碼建立C3P0資料庫連接池
ds= new ComboPooledDataSource();
ds.setDriverClass("oracle.jdbc.driver.OracleDriver");
ds.setJdbcUrl("jdbc:oracle:thin:@140.207.38.242:1521:O2O");
ds.setUser("bm114_test");
ds.setPassword("bm114_test");
ds.setInitialPoolSize(10);
ds.setMinPoolSize(5);
ds.setMaxPoolSize(20);
}catch (Exception e) {
e.printStackTrace();
}
}
//從資料來源中擷取資料庫連接
publicstatic Connection getConnection() throws SQLException {
returnds.getConnection();
}
//關閉資料庫連接
publicstatic void close(Connection conn, Statement st, ResultSet rs) {
if(rs != null) {
try{
//關閉儲存查詢結果的ResultSet對象
rs.close();
}catch (Exception e) {
e.printStackTrace();
}
rs= null;
}
if(st != null) {
try{
//關閉負責執行SQL命令的Statement對象
st.close();
}catch (Exception e) {
e.printStackTrace();
}
}
if(conn != null) {
try{
//將Connection連線物件還給資料庫連接池
conn.close();
}catch (Exception e) {
e.printStackTrace();
}
}
}
publicstatic void main(String[] args) {
Connectioncon = null;
PreparedStatementst = null;
ResultSetrs = null;
try{
//擷取資料庫連接
con= EasyC3p0.getConnection();
Stringsql = " select sysdate from dual ";
PreparedStatementps = con.prepareStatement(sql);
rs= ps.executeQuery();
while(rs.next()) {
Stringvalue = rs.getString("sysdate");
System.out.println(value+ ",資料庫連接成功");
}
}catch (Exception e) {
e.printStackTrace();
}finally {
//釋放資源
EasyC3p0.close(con,st, rs);
}
}
}
5、運行結果
2015-02-03 16:16:27.0,資料庫連接成功
記性不如爛筆頭22-JAVA資料庫連接池 C3P0