2012-12-06 26 views
15

DBCP'de bağlantı sızıntısı ve kilitlenme sorunları ile karşılaştıktan sonra, bunu Tomcat JDBC havuzuna değiştirme kararı aldık. Tabi ki göç gerçekten çok basitti.DBCP'yi Tomcat JDBC-havuzuyla değiştirirken performansı artırın ve performansı azaltın.

Ancak, bir üretim ortamına dağıttıktan sonra, iki Tomcats'ı çalıştıran bir sunucuda yükün 4-4.5'ten 5.5'e yükseldiğini fark ettim. Havuz değişikliği haricinde daha fazla bir şey yapmadık. Ayrıca, JMeter ile ölçülen performans yaklaşık% 5 oranında azalır.

Havuz parametrelerini ayarlamak için biraz zaman harcadım, ancak görünür efektler olmadan.

<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 ve PoolSweeperEnabled Bahar ApplicationContext-jdbc.xml olarak

doğruysa sadece var:

<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> 

Ben neyim aşağıda (server.xml içinde <GlobalNamingResources> itibaren) benim şimdiki yapılandırma yapıştırılan yanlış mı yapıyorsun? JDBC_pool'un kutudan DBCP'den daha hızlı olması gerektiğini düşündüm.

+0

TestWhenIdle = "true" 'yı deneyin ve aynı zamanda maxActive sayısını 100 gibi bir şeyden en aza indirmeye çalışın. 20. havuzda çok fazla bağlantı olması, yavaşlatıyor. –

+1

Daha önce olduğu gibi aynı doğrulama sorgusunu kullanıyor musunuz? – rootkit

+0

@ rootkit007 - hayır, dbcp ile ant doğrulama sorgusu kullanmadım. – Dzinek

cevap

0

Tanınız tuhaftır: AFAIK Tomcat'in DBCP lib dosyası, commons-dbcp'nin yeniden paketlenmiş bir sürümüdür ... böylece birinden diğerine geçme, davranış veya performansta herhangi bir değişikliğe yol açmamalıdır. (bkz. here)

Kullandığınız sürüm (ler) de olsa ne değişmiş olabilir: özellikle, 1.3/1.4 farklarına dikkat edin. (bkz. here)

Her durumda, yapılandırmanız iyi görünüyor (ve karşılaşabileceğiniz sorunlara rağmen gerçekten çalışıyor). Senin libs güncellenmesi muhtemelen hata ayıklama moduna girmeden sorunlarınızı çözmek için tek yol oldu ...

Daha da ileri gitmek gerekirse, "DBCP'de bağlantı sızıntısı ve kilitlenme sorunları" ile ne demek istediğiyle ilgili daha spesifik olabilir misiniz? Kilitlenme ile bağlantı havuzu arasında bir bağlantı olduğunu belirlemek oldukça kesin bir tanıdır: Buna nasıl geldiniz? Kilitlenmeler yaşıyor olabilirsiniz çünkü SQL ifadeleriniz kilitlenme gerçekleşmesine eğilimlidir, ancak havuz sadece aynı anda birçok bağlantı sağlayarak bunu mümkün kılar - bu sadece işidir.

+0

OP, Tomcat'in yeniden paketlenmiş dbcp'inden farklı olan Tomcat jdbc-pool hakkında konuşuyor. http://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html – dnault

1

Ayarlarınız ve ayarlarınız doğru görünüyor. Yük artışınız, sunucunun aynı anda daha fazla eşzamanlı istekleri ele almasının bir sonucu olabilir. DBCP, havuzun tüm iş parçacıklarından nasıl kilitlendiğinden dolayı sunucunun bu yükü almasını engellemiş olabilir. Jdbc-havuzu bunu yapmaz, şimdi eşzamanlılığınızı artırdınız. Ve yük artarsa, yanıt azalabilir, ancak veriminiz artacaktır.

Ben eşzamanlılık işlemek için lütfen maxthreads eşleşecek şekilde ayarlama

maxActive 

başlardım.