1. 程式人生 > >幾種開源資料庫連線池的使用感受

幾種開源資料庫連線池的使用感受

在專案中嘗試使用了幾種開源的資料庫連線池實現。一種是dbcp,一種是c3p0,還有一種是proxool,這幾種資料庫連線池都可以很容易的在Spring配置起來。效能總體上上感覺dbcp為最優,因為穩定性和併發性都是我的專案需要的。
     專案中經過反覆測試,如果web server和資料庫server不是同一個機器的話,在斷網時間比較短的時間內三種資料庫連線池都能較好的重連,但是在斷網時間超過8個鐘頭 proxool就不能恢復工作了。但是dbcp卻能很快的重新連線。實際生產環境中穩定性和總體效能是最重要的,都需要做相應的測試才能放心的讓系統上生 產線。


這裡給出專案中資料庫連線池配置:

dbcp的jndi:

1 < bean  id ="dataSource" 2         class ="org.springframework.jndi.JndiObjectFactoryBean" > 3          < property  name ="jndiName" > 4          < value > java:comp/env/jdbc/mysql </ value > 5          </ property > 6          </ bean >


proxool(proxool-0.9.0RC1)的配置:

< bean  id ="MySqlDataSource"
  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
&amp; characterEncoding=utf8 &amp; autoReconnect=true </ value > </ property > < property  name ="user" > < value > user </ value > </ property > < property  name ="password" > < value > password </ value > </ property > < property  name ="maximumConnectionCount" > < value > 500 </ value > </ property > < property  name ="houseKeepingSleepTime" > < value > 15000 </ value > </ property > < property  name ="houseKeepingTestSql" > < value > select CURRENT_DATE </ value > </ property > < property  name ="testBeforeUse" > < value > true </ value > </ property > < property  name ="alias" > < value > mysqlProxoolDataSource </ value > </ property > <!--
  <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):

 1 < bean  id ="dataSource"      class ="com.mchange.v2.c3p0.ComboPooledDataSource"  2         destroy-method ="close" >  3          < property  name ="driverClass" >  4          < value > com.mysql.jdbc.Driver </ value >  5          </ property >  6          < property  name ="jdbcUrl" >  7          < value > jdbc:mysql://192.168.0.225:3306/sendinmdb?useUnicode=true &amp; characterEncoding=utf8 &amp; autoReconnect=true </ value >  8          </ property >  9          < property  name ="user" > 10          < value >******** </ value > 11          </ property > 12          < property  name ="password" > 13          < value >******** </ value > 14          </ property > 15          < property  name ="maxPoolSize" > 16          < value > 100 </ value > 17          </ property > 18          < property  name ="maxIdleTime" > 19          < value > 50 </ value > 20          </ property > 21          < property  name ="maxStatementsPerConnection" > 22          < value > 100 </ value > 23          </ property > 24          < property  name ="numHelperThreads" > 25          < value > 1000 </ value > 26          </ property > 27          < property  name ="idleConnectionTestPeriod" > 28          < value > 30 </ value > 29          </ property > 30          </ bean >




直接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&amp;characterEncoding=utf8&amp;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"