c3p0,dbcp和proxool使用心德

快過年了,大家都在網上訂票了,鐵道部的訂票網的訪問速度,實在是太讓人感動了。本人受到刺激後,對自己的框架做了一次性能優化,首先從數據庫連接池開始。
    關於c3p0、dbcp和proxool,之類的比較,配置在網上有很多的文章,我這邊就不浪費大家的時間了,主要講下我用過這三個之後的體會。
  1. dbcp:框架以前使用的是dbcp,網上說,有很多BUG,至少,這些BUG,我是沒有碰到過,從我們系統運行的情況來看,還可以,沒什麼太多問題,也許是我們的系統訪問量不是太大(現在每日平臺30個併發左右)。但有個非常坑爹場景,我們測試環境上,大大小小有8個項目在跑,數據庫是跟一個ftp服務器搭建在一起(資源有限,沒辦法的事),ftp服務會經常重啓,一重啓,dbcp就無法自動連接了,那8個項目要重新啓動一下才行。肯定有人會問,把那個數據庫放到不經常重啓的機器上,不就可以了嗎?是的,這是一個辦法,但還是不能迴避dbcp無法自動重連的問題。
  2. c3p0:框架目前使用的是c3p0,這個是在網上,也有很相關的文章,同時,也是hibernate推薦的,在這裏不浪費大家的時間了。該連接池解決了dbcp無法自動重連問題,在穩定性方面,甚少我們的系統還不錯。
  3. 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
      package org.springframework.orm.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來試試,看看效果
發佈了16 篇原創文章 · 獲贊 14 · 訪問量 14萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章