2

我試圖找出一個問題,我們在使用Tomcat 6.0.37和MySQL 5.5的高流量站點的封面下。測試負載是200個Tomcat併發連接 - 所有連接到同一個URL,並且所有連接都到達數據庫。Apache Commons DBCP奇怪的行爲

要做我們的連接池,我們使用嵌入式的tomcat-dbcp包。下面是我們使用的資源配置:

<Resource name="jdbc/appDataSource" auth="Container" 
      type="javax.sql.DataSource" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost/myapp?autoReconnect=true&amp;characterEncoding=UTF-8" 
      username="root" 
      password="*****" 

      testOnBorrow="true" 
      maxWait="5000" 
      maxIdle="1" 
      maxActive="30" 
      validationQuery="SELECT 1" 
      validationInterval="30000" 
      timeBetweenEvictionRunsMillis="30000" 

      logAbandoned="true" 
      removeAbandoned="true" 
      removeAbandonedTimeout="60" 
    /> 

當我運行在該網站上我看到了連接池失去聯繫很廣泛一些測試流量。大約一分鐘後,我已經有超過10000次的MySQL連接嘗試,並且連接池從未連接過超過20個連接 - 所有連接都幾乎立即關閉。

我試圖切換到Apache下議院通過我的配置將它添加到lib文件夾和包括財產

  factory="org.apache.commons.dbcp.BasicDataSourceFactory" 

,但它給了我同樣的結果。

我試圖切換到C3P0和BoneCP這實際上做得很不錯,我看到了正在舉行的30個連接的最大值 - 關於MySQL

我使用Apache的連接池也試過沒有新的或掉線Tomcat的7(只是爲了它的緣故),而且還具有以下配置工作得很好:

<Resource name="jdbc/appDataSource" auth="Container" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost/myapp?autoReconnect=true&amp;characterEncoding=UTF-8" 
      username="root" 
      password="******" 

      maxIdle="1" 
      maxActive="30" 
      validationQuery="SELECT 1" 
      validationInterval="30000" 
      timeBetweenEvictionRunsMillis="30000" 

      logAbandoned="true" 
      removeAbandoned="true" 
      removeAbandonedTimeout="60" 
    /> 

我不知道是否有什麼東西真的錯了與Apache下議院DBCP,它並沒有在最簡單的情況下,甚至工作?有沒有解釋所有這一切?

+0

您是否發現溶劑?我有同樣的問題。 – Jens

回答

0

DBCP被認爲已經過時,而不是生產級系統與他們重載(多線程),建議在DBCP使用C3P0的。

C3P0是一個易於使用的庫,通過使用jdbc3規範定義的功能和jdbc2的可選擴展來增強傳統JDBC驅動程序的「企業級」。

Tomcat 7似乎有一個新的連接池作爲新功能;它是commons-dbcp連接池的替代品。儘管commons-dbcp連接池對於小型或低流量應用程序可以正常工作,但它在高度併發環境中存在問題(例如,考慮多核/多CPU)。

請參考 Connection pooling options with JDBC: DBCP vs C3P0瞭解更多關於DBCP vs C3P0的信息。

0

問題的根源在於maxIdle設置較低。將maxIdle設置爲1意味着在給定時間不會有超過1個連接可以在池中閒置。在大量併發負載下,連接有時會以比他們借用的速度更快的速率返回,導致池中空閒連接的瞬間累積。在maxIdle設置爲1時,除第一個閒置連接外,所有閒置連接都將在返回時關閉。將maxIdle保留爲默認值(對於1.x爲8)或將其設置爲maxActive應該可以提高性能。

請參閱https://commons.apache.org/proper/commons-dbcp/api-1.4/org/apache/commons/dbcp/BasicDataSource.html#maxIdle