2012-12-06 30 views
15

後在DBCP與連接泄漏和死鎖問題,我們做了一個決定和Tomcat JDBC池來代替它。當然,遷移非常簡單。增加負荷和降低性能的同時替換DBCP到Tomcat JDBC池

但經過它部署到生產環境中,我注意到,該負載運行兩個雄貓增加,從4-4.5到5.5的服務器上。除了改變游泳池之外,我們什麼也沒做。而且,使用JMeter測量的性能下降約5%。

我花了一些時間來調整池參數,但沒有可見的效果。我貼我目前的配置(從<GlobalNamingResources>server.xml)所示:

<Resource name="jdbc/xxxxxx" 
      auth="Container" 
      type="javax.sql.DataSource" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      initialSize="10" 
      maxActive="100" 
      minIdle="10" 
      maxIdle="50" 
      maxWait="10000" 
      testOnBorrow="true" 
      testOnReturn="false" 
      testOnConnect="false" 
      testWhileIdle="false" 
      validationQuery="SELECT 1 from dual" 
      validationInterval="30000" 
      suspectTimeout="60" 
      timeBetweenEvictionRunsMillis="30000" 
      removeAbandonedTimeout="60" 
      removeAbandoned="true" 
      logAbandoned="true" 
      abandonWhenPercentageFull="50" 
      minEvictableIdleTimeMillis="60000" 
      jmxEnabled="true" 
      username="xxxxx" 
      password="xxxxx" 
      driverClassName="oracle.jdbc.OracleDriver" 
      url="jdbc:oracle:oci:xxxxx"/> 

FairQueue和PoolSweeperEnabled是真正的

在Spring的ApplicationContext - jdbc.xml中我只有:

<bean id="dataSource" class="org.springframework.jndi.JndiObjectFactoryBean"> 
    <property name="resourceRef"> 
     <value>true</value> 
    </property> 
    <property name="jndiName"> 
     <value>java:comp/env/jdbc/PortalDB</value> 
    </property> 
    </bean> 

我是什麼做錯了?我認爲,JDBC_pool應該比開箱即用的DBCP更快。

+0

嘗試testWhenIdle =「真」,並嘗試從100減少maxActive數量爲類似20.也許有在池中過多的連接正在放緩下來。 –

+1

您是否使用與以前相同的驗證查詢? – rootkit

+0

@ rootkit007 - 不,使用dbcp我沒有使用ant驗證查詢。 – Dzinek

回答

0

你的診斷是奇怪:據我所知Tomcat的DBCP lib只是一個重新包裝的commons-DBCP的版本......從一個如此變化到另一個不應該導致行爲和性能的任何變化。 (見here

什麼儘管可能已經改變的是你使用的版本(S):特別提防的1.3/1.4的差異。 (見here

不管怎麼說,你的配置似乎好(和它的作品的確,儘管你可能會遇到的問題)。更新你的庫可能是解決你的問題,而無需進入調試模式的唯一方法...

更進一步,你可以更具體地說明「DBCP中連接泄漏和死鎖問題」的含義嗎?確定死鎖和連接池之間存在關聯是一個相當精確的診斷:您是如何得出這個結論的?您可能會遇到死鎖,因爲您的SQL語句很容易發生死鎖,而池只能通過同時提供多個連接來實現 - 實際上這只是它的工作。

+0

OP正在討論Tomcat jdbc-pool,它與Tomcat的重新打包的dbcp不同。 http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

您的設置和調整顯示正確。您的負載增加可能是由於服務器同時處理更多併發請求的結果。 DBCP可能會阻止服務器承擔此負載,因爲它從所有線程鎖定池。 jdbc池不這樣做,所以現在你已經增加了併發性。如果負載增加,響應可能會降低,但吞吐量會增加。

我開始調整

maxActive 

,以便處理併發符合您maxThreads。