幾種開源資料庫連線池的使用感受
在專案中嘗試使用了幾種開源的資料庫連線池實現。一種是dbcp,一種是c3p0,還有一種是proxool,這幾種資料庫連線池都可以很容易的在Spring配置起來。效能總體上上感覺dbcp為最優,因為穩定性和併發性都是我的專案需要的。
專案中經過反覆測試,如果web
server和資料庫server不是同一個機器的話,在斷網時間比較短的時間內三種資料庫連線池都能較好的重連,但是在斷網時間超過8個鐘頭
proxool就不能恢復工作了。但是dbcp卻能很快的重新連線。實際生產環境中穩定性和總體效能是最重要的,都需要做相應的測試才能放心的讓系統上生
產線。
這裡給出專案中資料庫連線池配置:
dbcp的jndi:
proxool(proxool-0.9.0RC1)的配置:
class ="org.logicalcobwebs.proxool.ProxoolDataSource"
lazy-init ="false" > < property name ="driver" > < value > com.mysql.jdbc.Driver </ value > </ property > < property name ="driverUrl" > < value > jdbc:mysql://ip:3306/dbname?useUnicode=true
<property name="maximumActiveTime">
<value>10000</value>
</property>
--> < property name ="simultaneousBuildThrottle" > < value > 1000 </ value > </ property > < property name ="trace" > < value > false </ value > </ property > </ bean >
建議使用DBCP,配置在tomcat中,然後在spring中使用jndi的形式獲取。
c3p0(c3p0-0.9.0):
直接copy & paste到spring配置檔案裡就可以使用了。
配置一些額外的tomcat 的DBCP連線池引數,也可以更好的使用到類似proxool提供的功能,只是dbcp更加穩定而已。
tomcat/conf/context.xml中插入一個Resource元素:
< Resource name ="jdbc/mysql" auth ="Container" type ="javax.sql.DataSource"maxActive ="1000" maxIdle ="30" maxWait ="10000"
username ="user" password ="password" driverClassName ="com.mysql.jdbc.Driver"
validationQuery = "select current_date()"
testOnBorrow = "true" testOnReturn = "false" testWhileIdle = "true"
timeBetweenEvictionRunsMillis = "15000" numTestsPerEvictionRun = "10" minEvictableIdleTimeMillis = "600000"
url ="jdbc:mysql://ip:3306/sendinmdb?useUnicode=true&characterEncoding=utf8&autoReconnect=true" />
解釋一下以下這些引數的含義:
validationQuery = "select current_date()"
testOnBorrow = "true"
testOnReturn = "false"
testWhileIdle = "true"
當
從池中獲取一個Connection後使用 select current_date()
來測試該資料庫連線的可用性,如果SQL語句返回結果則認為是一個有效的連線,否則將繼續測試知道可以拿到有效的連線。當返回Connection給池的
時候不進行驗證,但是Connection空閒的時候就要進行認證。
timeBetweenEvictionRunsMillis = "15000"
DBCP 清空執行緒睡眠的間隙,如值為負數則不執行該執行緒
numTestsPerEvictionRun = "10"
清空執行緒每次驗證的連線物件個數
minEvictableIdleTimeMillis = "600000"