前段時間因為項目原因,要在修改數據庫連接池到DBCP上,折騰了半天,有一點收獲,不敢藏私,特在這里與朋友們共享。
在配置時,主要難以理解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個參數,設置了rmoveAbandoned=true那么在getNumActive()快要到getMaxActive()的時候,系統會進行無效的Connection的回收,回收的Connection為removeAbandonedTimeout(默認300秒)中設置的秒數后沒有使用的Connection,激活回收機制好像是getNumActive()=getMaxActive()-2。 :) 有點忘了。
logAbandoned=true的話,將會在回收事件后,在log中打印出回收Connection的錯誤信息,包括在哪個地方用了Connection卻忘記關閉了,在調試的時候很有用。
在這里私人建議maxWait的時間不要設得太長,maxWait如果設置太長那么客戶端會等待很久才激發回收事件。
以下是我的配置的properties文件:
#連接設置
jdbc.driverClassName=oracle.jdbc.driver.OracleDriver
jdbc.url=jdbc:oracle:thin:@127.0.0.1:1521:DBSERVER
jdbc.username=user
jdbc.password=pass
#<!-- 初始化連接 -->
dataSource.initialSize=10
#<!-- 最大空閑連接 -->
dataSource.maxIdle=20
#<!-- 最小空閑連接 -->
dataSource.minIdle=5
#最大連接數量
dataSource.maxActive=50
#是否在自動回收超時連接的時候打印連接的超時錯誤
dataSource.logAbandoned=true
#是否自動回收超時連接
dataSource.removeAbandoned=true
#超時時間(以秒數為單位)
#設置超時時間有一個要注意的地方,超時時間=現在的時間-程序中創建Connection的時間,如果maxActive比較大,比如超過100,那么removeAbandonedTimeout可以設置長一點比如180,也就是三分鐘無響應的連接進行回收,當然應用的不同設置長度也不同。
dataSource.removeAbandonedTimeout=180
#<!-- 超時等待時間以毫秒為單位 -->
#maxWait代表當Connection用盡了,多久之后進行回收丟失連接
dataSource.maxWait=1000
以下是我在連接控制中調用的方法:
Properties dbProps=null;
//下面的讀取配置文件可以根據實際的不同修改
dbProps = ConfigProperties.getInstance().getProperties("jdbc.properties");
try {
String driveClassName = dbProps.getProperty("jdbc.driverClassName");
String url = dbProps.getProperty("jdbc.url");
String username = dbProps.getProperty("jdbc.username");
String password = dbProps.getProperty("jdbc.password");
String initialSize = dbProps.getProperty("dataSource.initialSize");
String minIdle = dbProps.getProperty("dataSource.minIdle");
String maxIdle = dbProps.getProperty("dataSource.maxIdle");
String maxWait = dbProps.getProperty("dataSource.maxWait");
String maxActive = dbProps.getProperty("dataSource.maxActive");
//是否在自動回收超時連接的時候打印連接的超時錯誤
boolean logAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.logAbandoned","false"))).booleanValue();
//是否自動回收超時連接
boolean removeAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.removeAbandoned","false"))).booleanValue();
//超時時間(以秒數為單位)
int removeAbandonedTimeout = Integer.parseInt(dbProps.getProperty("dataSource.removeAbandonedTimeout","300"));
dataSource = new BasicDataSource();
dataSource.setDriverClassName(driveClassName);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
//初始化連接數
if(initialSize!=null)
dataSource.setInitialSize(Integer.parseInt(initialSize));
//最小空閑連接
if(minIdle!=null)
dataSource.setMinIdle(Integer.parseInt(minIdle));
//最大空閑連接
if(maxIdle!=null)
dataSource.setMaxIdle(Integer.parseInt(maxIdle));
//超時回收時間(以毫秒為單位)
if(maxWait!=null)
dataSource.setMaxWait(Long.parseLong(maxWait));
//最大連接數
if(maxActive!=null){
if(!maxActive.trim().equals("0"))
dataSource.setMaxActive(Integer.parseInt(maxActive));
}
System.out.println("logAbandoned="+logAbandoned);
dataSource.setLogAbandoned(logAbandoned);
dataSource.setRemoveAbandoned(removeAbandoned);
dataSource.setRemoveAbandonedTimeout(removeAbandonedTimeout);
Connection conn = dataSource.getConnection();
if(conn==null){
log.error("創建連接池時,無法取得連接!檢查設置!!!");
}else{
conn.close();
}
log.error("連接池創建成功!!!");
}
catch (Exception e) {
log.error("創建連接池失敗!請檢查設置!!!");
}
有誤的地方歡迎指正! by yy。。。。。。
Hibernate支持DBCP包進行數據庫連接池的配置。簡要說明配置過程:
(僅僅是個人摸索,如有問題,歡迎指點)
需要的包:
Commons-Pool (下載地址:http://jakarta.apache.org/commons/pool/) :提供一個一般對象池的接口,而且包含實現了通常池工具箱。
Commons-DBCP(下載地址:http://jakarta.apache.org/commons/dbcp/) :提供數據庫連接池服務。DBCP很聰明,把Commons-Pool和JDBC的driver封裝起來,使達到連接池的目的。
Hibernate屬性文件的配置參數
#連接池的最大活動個數
hibernate.dbcp.maxActive 100
#當連接池中的連接已經被耗盡的時候,DBCP將怎樣處理( 0 = 失敗, 1 = 等待, 2= 增長)
hibernate.dbcp.whenExhaustedAction 1
#最大等待時間
hibernate.dbcp.maxWait 120000
#沒有人用連接的時候,最大閑置的連接個數。
hibernate.dbcp.maxIdle 10
##以下是對prepared statement的處理,同上。
hibernate.dbcp.ps.maxActive 100
hibernate.dbcp.ps.whenExhaustedAction 1
hibernate.dbcp.ps.maxWait 120000
hibernate.dbcp.ps.maxIdle 10
## 可選,是否對池化的連接進行驗證
#給出一條簡單的sql語句進行驗證
#hibernate.dbcp.validationQuery select 1 from dual
#在取出連接時進行有效驗證
#hibernate.dbcp.testOnBorrow true
#在放回連接時進行有效驗證
#hibernate.dbcp.testOnReturn false
#Hibernate已經實現了DBCP Provider實現,別忘了在下面的鍵值去掉#字符
hibernate.connection.provider_class net.sf.hibernate.connection.DBCPConnectionProvider
- <property name="connection.pool.size">2</property>
- <property name="statement_cache.size">25</property>
- <property name="jdbc.fetch_size">50</property>
- <property name="jdbc.batch_size">30</property>
-
- <property name="show_sql">true</property>
- <property name="connection.provider_class">net.sf.hibernate.connection.DBCPConnectionProvider</property>
- <property name="dbcp.maxActive">100</property>
- <property name="dbcp.whenExhaustedAction">1</property>
- <property name="dbcp.maxWait">120000</property>
- <property name="dbcp.maxIdle">10</property>
- <property name="dbcp.ps.maxActive">100</property>
- <property name="dbcp.ps.whenExhaustedAction">1</property>
- <property name="dbcp.ps.maxWait">120000</property>
- <property name="dbcp.ps.maxIdle">100</property>
posted on 2007-05-25 15:45
SIMONE 閱讀(11202)
評論(0) 編輯 收藏 所屬分類:
JAVA 、
JSP