關於c3p0、dbcp和proxool,之類的比較,配置在網上有很多的文章,我這邊就不浪費大家的時間了,主要講下我用過這三個之後的體會。
- dbcp:框架以前使用的是dbcp,網上說,有很多BUG,至少,這些BUG,我是沒有碰到過,從我們系統運行的情況來看,還可以,沒什麼太多問題,也許是我們的系統訪問量不是太大(現在每日平臺30個併發左右)。但有個非常坑爹場景,我們測試環境上,大大小小有8個項目在跑,數據庫是跟一個ftp服務器搭建在一起(資源有限,沒辦法的事),ftp服務會經常重啓,一重啓,dbcp就無法自動連接了,那8個項目要重新啓動一下才行。肯定有人會問,把那個數據庫放到不經常重啓的機器上,不就可以了嗎?是的,這是一個辦法,但還是不能迴避dbcp無法自動重連的問題。
- c3p0:框架目前使用的是c3p0,這個是在網上,也有很相關的文章,同時,也是hibernate推薦的,在這裏不浪費大家的時間了。該連接池解決了dbcp無法自動重連問題,在穩定性方面,甚少我們的系統還不錯。
-
proxool:關於這個連接池,網上說的例子也有很多,說是性能最好的一個連接池,坑爹的是,網上講的它跟spring的整合,有很多都是不對的,直接通過spring配置就可以了,沒有必要像網上說的,把listener,改成servlet,直接通過spring的bean配置就可以了,這個在網也有很多。關於這個連接池,我在測試時,發現默認情況下,是不會自動重連的,需要通過如下配置: <bean
id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="org.logicalcobwebs.proxool.ProxoolDriver" />
<property name="url" value="xxxx.xml" />
</bean> 在xxxx.xml裏配置 <proxool>
<alias>pool</alias>
<driver-url>jdbc:mysql://192.168.1.4:3306/MIGRATE_TEST?characterEncoding=utf- 8&autoReconnect=true</driver-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<driver-properties>
<property name="user" value="website" />
<property name="password" value="website" />
<property name="autoReconnect" value="true" />
</driver-properties>
<minimum-connection-count>1</minimum-connection-count>
<maximum-connection-count>8</maximum-connection-count>
<prototype-count>1</prototype-count>
<test-before-use>true</test-before-use>
<house-keeping-sleep-time>60000</house-keeping-sleep-time>
</proxool> mysql的URL的後面要加上autoReconnect=true,值得注意的是,當使用ibatis時,日誌會報warn:registered a statement as closed which wasn't known to be open. 那是因爲在ibatis
public class SqlMapClientTemplate extends JdbcAccessor implements SqlMapClientOperations {
public <T> T execute(SqlMapClientCallback<T> action) throws DataAccessException {
..........
finally {
// Only close SqlMapSession if we know we've actually opened it
// at the present level.
if (ibatisCon == null) {
session.close();// 由這段引起的,池ibatisCon不爲空時,session永遠不會關閉
}
}
}
}
將紅色部分改爲 if (ibatisCon != null),就行了
4. 根據以上三種連接池的情況來看,在首次訪問時,dbcp大約需要600毫秒,c3p0需要450毫秒,proxool需要1356毫秒,訪問後,速度基本都在幾十毫秒以內,除非sql寫得很複雜。
以上的測試毫秒數,只是本人根據日誌來反映的,不據參考價值,雖然網上說proxool性能最好,我覺得,還是自己使用後才知道真正的性能,所以我選擇c3p0來試試,看看效果