今天的工作很輕鬆,所以下午的時候去翻看了以前的代碼(也是公司前輩們的結晶),最近一直在做網站,大大小小已經作了好多個了,有一些公用的方法幾乎都是拿過來就用,看都沒有看,現在有時間了,就拿來研究下。第一個看的就是數據庫連接部分,沒想到看這個代碼用了我差不多半天的時間~
以前都在用,但是對裏面很多的地方都不是很瞭解,公司裏也用了數據池連接,這個還真的不了~ 所以找了點資料,看了一知半解的,所以保存下來以後反覆學習~
使用dbcp做爲數據庫連接池- -
在數據庫應用中,數據庫連接過程需要較長的時間。
而且,頻繁的連接數據庫會增加數據庫系統的壓力。
所以,最好在項目中使用數據庫連接池來減少數據庫連接的數量提高數據庫訪問效率。
DBCP是Apache的一個開源項目:
commons.dbcp
http://jakarta.apache.org/commons/dbcp/index.html
DBCP依賴Apache的另外2個開源項目
commons.collections
和
commons.pool
下載這些包並將這些包的路徑添加到classpath中就可以使用dbcp做爲項目中的數據庫連接池使用了。
commons 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
#超時時間(以秒數爲單位)
dataSource.removeAbandonedTimeout=180
#<!-- 超時等待時間以毫秒爲單位 6000毫秒/1000等於60秒 -->
dataSource.maxWait=1000
以下是我在連接控制中調用的方法:
//下面的讀取配置文件可以根據實際的不同修改
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("創建連接池時,無法取得連接!檢查設置!!!");
}else{
conn.close();
}
System.out.println("連接池創建成功!!!");
}
catch (Exception e) {
e.printStackTrace();
System.out.println("創建連接池失敗!請檢查設置!!!");
}