2011-04-18 14 views
9

Tomcat (sürüm 7) 'de dbcp bağlantı havuzu kullanıyorum ve kodumda bir yere bağlantı sızıntısı var.Tomcat'te terkedilmiş bağlantıların kaynağını belirlemeye çalışıyor

bana ona benim kodu ile geri döndü ve "havuz hatası Zaman aşımı boşta nesne için bekleyen bir bağlantı alınamıyor": Kısa bir miktar sonra, yeni bir bağlantı için bir istek aşağıdaki özel durum döndürür Tüm bağlantılar düzgün kapatılıyor gibi görünüyor (herkes bunu söylemiyor ...).

logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300" 

Yani kaynak etiketi artık şuna benzer:

bu hata ayıklamak için ben context.xml aşağıdaki özelliklere ilave

<Resource name="jdbc/findata" auth="Container" type="javax.sql.DataSource" 
       maxActive="20" maxIdle="5" maxWait="10000" 
       username="root" password="xxxxxx" driverClassName="com.mysql.jdbc.Driver" 
       logAbandoned="true" removeAbandoned="true" removeAbandonedTimeout="300" 
       url="jdbc:mysql://localhost:3306/findata"/> 

Sonra yeniden tomcat ve web vurmaya başladı Hata mesajı görüntülenene kadar sayfalar (tarayıcı penceresinde). Ancak henüz "logAbandoned" özelliğinin bilgilerini yazdığını henüz anlamadım. Ben

/usr/share/apache-tomcat-7.0.11/logs 

yılında arıyorum ama orada sadece son değiştirilen günlük dosyası Herhangi yardım çok takdir edilir

localhost_access_log.2011-04-18.txt 

olduğunu. Ben de benzer bir senaryo yaptığı şey

+0

Kayıtlarda terkedilmiş bağlantıların nasıl görüneceğini anlayamadım, ama başka bir zamana geri dönüp bu sefer başarılı oldum. sızıntının kaynağını bulmakta. Kimin hata ayıklayıcılara veya kayıtlara ihtiyacı var - değil mi? ;) – opike

cevap

4

dışarı başka bir iş parçacığı baskı her dakika ya da öylesine açık her bağlantısına ait threadstacks sonra bağlantıları talep ve hangi parçacığı threadstacks kurtarmaktı. Sanırım bu, bunu yapmanın kaba kuvvet yolu. Ama sorunumu çok çabuk çözdüm.

+1

İyi olan. Ve desteyi haritadan kapatın(), sağ? Basit ve verimli. –

3

Bağlantıyı her zaman kapattığınızdan emin olmanın nispeten kolay bir yolu, sunucu filtresi içine almak, ThreadLocal içine yerleştirmek, bu ThreadLocal'ı tüm kodunuz aracılığıyla kullanmak ve sonra yanıt filtreden geçtiğinde kapatmaktır. (Bir optimizasyon, sadece ilk istekte bağlantı alan ThreadLocal'a bir proxy yerleştirmek olurdu).

Ama acil sorununuz, sızıntı kaynağını bulmaktır, değil mi?

Öncelikle, bu yüzden bir istisna yapıyor engel olmaz, nihayet {} açıklamada bağlantıları kapatmayı unutmayın.

İkincisi, logAbandoned bağlantısı boşta anlamaya yönelik kadar sürdüğünü belirsizdir. Bir süre beklemeyi dene, 15 dakika kadar olabilir.

Üçüncü olarak, http://code.google.com/p/log4jdbc/ gibi proxy JDBC sürücüleri kullanabilirsiniz. Bağlantılar üzerinden tüm etkinliklerin bir günlüğünü oluştururlar, dolayısıyla günlüğe uyumsuz açık() ve kapat() bulmak için günlüğü çağırabilirsiniz.

İyi şanslar!

7

this site göre size context.xml adresinin kaynak tanımına bir fabrika sağlamalıdır. Bütün "ek" parametrelerinin bu şekilde ayarlanır böylece kaynağının yapılandırma bu fabrika örneği tarafından yapılacaktır. Daha spesifik olmak için context.xml (veya sunucunuzda böyle bir şey olurdu).

<Resource name="jdbc/db" auth="Container" type="javax.sql.DataSource" 
factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
driverClassName="org.postgresql.Driver" url="jdbc:postgresql://127.0.0.1/db" 
username="hibernate" password="hibernate" maxActive="20" maxIdle="10" 
maxWait="1000" removeAbandoned="true" removeAbandonedTimeout="20" 
logAbandoned="true" /> 

Bildirimi bizim amacımız için esastır factory="org.apache.tomcat.jdbc.pool.DataSourceFactory": - xml Eğer kaynak) tanımlamak nereye bağlıdır. Bu olmadan removeAbandoned="true" hiçbir etkisi yoktur.

Terk edilen her bir bağlantının yığınları catalina.log ($tomcat_dir/logs) 'da saklanır. Buradan, hata ayıklama bağlantıları için oldukça hassas bilgiler verecektir.

"Terkedilmiş" parametreler dışında tomcat jdbc havuz performansı, zaman aşımları ve diğer renk tonları ve cıvatalarla ilgili birçok şeyi yapılandırabilirsiniz. Elbette bu biraz derin bir bilgi birikimi gerektiriyor. (İlk başta sağladığım sitede ayrıntıları bulabilirsiniz)

+0

Fabrikada kaldırma işleminin gerekli olduğunu nereden öğrendiniz? Yerel konfigürasyonumda fabrika yok. Ancak, terk edilmiş bağlantılar kapanıyor. – KoenigGunther

+0

Bu, tomcat 7 belgelerinde belirtilen şekilde belirtilmiştir. Https://tomcat.apache.org/tomcat-7.0-doc/jdbc-pool.html –

İlgili konular