commons DBCP 配置參數(shù)簡(jiǎn)要說(shuō)明
前段時(shí)間因?yàn)轫?xiàng)目原因,要在修改數(shù)據(jù)庫(kù)連接池到DBCP上,折騰了半天,有一點(diǎn)收獲,不敢藏私,特在這里與朋友們共享。
在配置時(shí),主要難以理解的主要有:removeAbandoned 、logAbandoned、removeAbandonedTimeout、maxWait這四個(gè)參數(shù),設(shè)置了rmoveAbandoned=true那么在getNumActive()快要到getMaxActive()的時(shí)候,系統(tǒng)會(huì)進(jìn)行無(wú)效的Connection的回收,回收的Connection為removeAbandonedTimeout(默認(rèn)300秒)中設(shè)置的秒數(shù)后沒有使用的Connection,激活回收機(jī)制好像是getNumActive()=getMaxActive()-2。 :) 有點(diǎn)忘了。
logAbandoned=true的話,將會(huì)在回收事件后,在log中打印出回收Connection的錯(cuò)誤信息,包括在哪個(gè)地方用了Connection卻忘記關(guān)閉了,在調(diào)試的時(shí)候很有用。
在這里私人建議maxWait的時(shí)間不要設(shè)得太長(zhǎng),maxWait如果設(shè)置太長(zhǎng)那么客戶端會(huì)等待很久才激發(fā)回收事件。
以下是我的配置的properties文件:
#連接設(shè)置
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
#最大連接數(shù)量
dataSource.maxActive=50
#是否在自動(dòng)回收超時(shí)連接的時(shí)候打印連接的超時(shí)錯(cuò)誤
dataSource.logAbandoned=true
#是否自動(dòng)回收超時(shí)連接
dataSource.removeAbandoned=true
#超時(shí)時(shí)間(以秒數(shù)為單位)
dataSource.removeAbandonedTimeout=180
#<!-- 超時(shí)等待時(shí)間以毫秒為單位 6000毫秒/1000等于60秒 -->
dataSource.maxWait=1000
以下是我在連接控制中調(diào)用的方法:
??????? Properties? dbProps=null;
//下面的讀取配置文件可以根據(jù)實(shí)際的不同修改
??????? 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");
????????? ?//是否在自動(dòng)回收超時(shí)連接的時(shí)候打印連接的超時(shí)錯(cuò)誤
?????? ? ?boolean logAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.logAbandoned","false"))).booleanValue();
?????? ? ?//是否自動(dòng)回收超時(shí)連接
?????? ? ?boolean removeAbandoned = (Boolean.valueOf(dbProps.getProperty("dataSource.removeAbandoned","false"))).booleanValue();
?????? ? ?//超時(shí)時(shí)間(以秒數(shù)為單位)
?????? ? ?int removeAbandonedTimeout = Integer.parseInt(dbProps.getProperty("dataSource.removeAbandonedTimeout","300"));
?????? ?
??????? ?dataSource = new BasicDataSource();
??????? ?dataSource.setDriverClassName(driveClassName);
??????? ?dataSource.setUrl(url);
??????? ?dataSource.setUsername(username);
??????? ?dataSource.setPassword(password);
??????? ?//初始化連接數(shù)
??????? ?if(initialSize!=null)
??????? ??dataSource.setInitialSize(Integer.parseInt(initialSize));
??????? ?
??????? ?//最小空閑連接
??????? ?if(minIdle!=null)
??????? ??dataSource.setMinIdle(Integer.parseInt(minIdle));
??????? ?//最大空閑連接
??????? ?if(maxIdle!=null)
??????? ??dataSource.setMaxIdle(Integer.parseInt(maxIdle));
??????? ?
??????? ?//超時(shí)回收時(shí)間(以毫秒為單位)
??????? ?if(maxWait!=null)
??????? ??dataSource.setMaxWait(Long.parseLong(maxWait));
??????? ?
??????? ?//最大連接數(shù)
??????? ?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("創(chuàng)建連接池時(shí),無(wú)法取得連接!檢查設(shè)置!!!");
??????? ?}else{
??????? ??conn.close();
??????? ?}
?????????System.out.println("連接池創(chuàng)建成功!!!");
??????? }
??????? catch (Exception e) {
??????? ?e.printStackTrace();
??????????? System.out.println("創(chuàng)建連接池失敗!請(qǐng)檢查設(shè)置!!!");
??????? }
有使用問(wèn)題或建議可與我聯(lián)系:yy-man@163.com
??????
?????????2006-04-20?? By: 小土
posted on 2006-04-20 11:49 YY 閱讀(3822) 評(píng)論(1) 編輯 收藏