2013-04-16 17 views
5

Üretim sistemimizde dibe ulaşamayacağımız görünen kilitlenmeler var. Çevrimiçi kullanıcıların sayısıyla herhangi bir korelasyon elde edemedik ve mevcut bağlantılar tükeniyor gibi görünmüyor.c3p0, Oracle ve Hazırda Bekletme ile sürekli kilitlenmeler

Oracle'a Hibernate ve c3p0 aracılığıyla bağlanan bir Java EE uygulamasına sahibiz. Bizim c3p0 yapılandırması:

[com.mchange.v2.async.ThreadPoolAsynchronousRunner] (Timer-1) com[email protected]4c9f1b4d -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 5 
    Active Threads: 5 
    Active Tasks: 
      [email protected]86 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
      [email protected]01 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
      [email protected]c4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4) 
      [email protected]8e (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
      [email protected]f8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#3) 
    Pending Tasks: 
      [email protected]e5 
      [email protected]5d 
      [email protected]a1 
      [email protected]eb 
      [email protected]35 

fiili havuz parçacığı yığın izleri farklıdır ve aşağıda bazı örnekler ekledik::

belirgin kilitlenme günlük çıkış daima az ya da çok şuna benzer
minPoolSize=10 
maxPoolSize=300 
initialPoolSize=30 
acquireIncrement=10 
maxIdleTime=1800 
maxStatementsPerConnection=0 
numHelperThreads=5 

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,jboss] 
      java.lang.AbstractStringBuilder.<init>(AbstractStringBuilder.java:45) 
      java.lang.StringBuilder.<init>(StringBuilder.java:80) 
      oracle.net.ns.Packet.<init>(Packet.java:513) 
      oracle.net.ns.ConnectPacket.<init>(ConnectPacket.java:64) 
      oracle.net.ns.NSProtocol.connect(NSProtocol.java:278) 
      oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,jboss] 
      oracle.jdbc.driver.T4CTTIoauthenticate.processRPA(T4CTTIoauthenticate.java:491) 
      oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:295) 
      oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:186) 
      oracle.jdbc.driver.T4CTTIoauthenticate.doOSESSKEY(T4CTTIoauthenticate.java:390) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:356) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
      com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:1 

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,jboss] 
      oracle.net.ns.NSProtocol.connect(NSProtocol.java:346) 
      oracle.jdbc.driver.T4CConnection.connect(T4CConnection.java:1042) 
      oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:301) 
      oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:531) 
      oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:221) 
      oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
      oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:503) 
      com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:135) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:182) 
      com.mchange.v2.c3p0.WrapperConnectionPoolDataSource.getPooledConnection(WrapperConnectionPoolDataSource.java:171) 
      com.mchange.v2.c3p0.impl.C3P0PooledConnectionPool$1PooledConnectionResourcePoolManager.acquireResource(C3P0PooledConnectionPool.java:137) 
      com.mchange.v2.resourcepool.BasicResourcePool.doAcquire(BasicResourcePool.java:1014) 
      com.mchange.v2.resourcepool.BasicResourcePool.access$800(BasicResourcePool.java:32) 
      com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1810) 
      com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 

Araştırmamızın nerede yapılması gerektiğine dair herhangi bir öneriniz var mı? Bu c3p0, sorgularımız, kodumuz, veritabanı mı?

+1

ORA-00060 hata kodu olmadığından veritabanını büyük olasılıkla ortadan kaldırabilirsiniz. Çifte kontrol etmek isterseniz, veritabanı istisnalarının bir yerde kaybolması durumunda, kilitlenme hataları da uyarı günlüğüne kaydedilir. DBA'nızın, tercihen belirli bir zamanda, kilitlenme uyarıları için uyarı kayıtlarını kontrol etmesini isteyin. –

+0

@jonearles Teşekkürler, DBA'nın kontrol etmesini isteriz. Sorgularımızla veya belki de yapılandırmamızla ilgili sorunlara eğiliyoruz, ancak sınırlı bilgi verildikten sonra nasıl devam edeceğimizden emin değiliz. – Zecrates

cevap

3

böylece yardımcınız Bağlantılar, Bağlantı alımları tarafından açıkça doygun hale geliyor. Bu, Bağlantıları elde etmek için yapılan çok sayıda girişimin, ne uzun süreler ne de bir süreden beri bir İstisna ile başarısız olduğu anlamına gelir. Bu, sonuçta hata ayıklamak için gereken sorun. İlk yapmam gereken, satın alma başarısız olduğunda havuzlanmış Threads kullanımını ekonomikleştiren bir "dağınık" edinme görevini kullanan c3p0-0.9.2.1 sürümüne yükseltmektir. ikinci bir öneri, numHelperThreads adlı c3p0 yapılandırma paramını belki de 3 varsayılan değerinden veya hatta kullandığınız 5'ten çok daha yüksek bir değere yükseltmek olabilir. Threads'larınızın aslında Bağlantı kazanımının çeşitli aşamalarında meşgul olduğu görülüyor, bu nedenle Bağlantıların edinilebileceği "şerit" sayısını arttırmak yardımcı olabilir. [ancak aşağıdaki postscript'e bakınız!]

Nihayetinde, yine de, bağlantı alımının neden bu kadar yavaş tamamlandığını sorgulayacaktır (bir APPARENT DEADLOCK için ilan edilecek, hiçbir satın alma işlemi 10 sn.). Bu bir veritabanı veya ağ sorunu olabilir.

ancak 0.9.2'ye yükseltmeyi ve numHelperThreads değerini artırmayı deneyin. [numHelperThreads öğesinin varsayılan değeri belki de eskidir; çok çekirdekli makinalar çağında, IO bağımlı görevlerine ayrılmış bir iş parçacığı havuzu büyük olasılıkla çekirdek sayısı katsayısının çok olması gerekir. Bu ince ayarlar sorunu iyi bir şekilde çözebilir ya da bir daha nereye bakılacağına dair daha iyi bilgilere yol açabilir.

iyi şanslar!

p.s. Gördüğünüz iş parçacığı yığın izleri, aslında oluşturma sırasında bir izleyici DEADLOCK için yığın izleri değil tahmin ediyorum. C3p0'ü duyuruncaya kadar APPARENT DEADLOCK'un yaklaştığını bildiğiniz için bunları zamanlamak zor olurdu. Bahse girerim, çıkmazda, bu yığın izleri birbiriyle çok daha benzerdir ve bir çeşit IO'yu bekler.

+0

Teşekkürler Steve, hafta sonu boyunca c3p0’ı yükseltip yükseltmeyeceğine karar vereceğiz. Gelecek hafta geri bildirim vereceğim. – Zecrates

+0

Merhaba, sorununun yükseltme ile çözülüp çözülmediğini öğrenebilir miyim? ya da poolsize ve helperthread ayarlama? – ROROROOROROR

İlgili konular