2013-08-07 4 views
9

я получаю это исключение в моем журнале Tomcat:C3P0 ПОЛНАЯ ТУПИК исключение

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
WARNING: com[email protected]76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks! 
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run 
WARNING: com[email protected]76b28200 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3 
    Active Threads: 3 
    Active Tasks: 
     [email protected]18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
     [email protected]e4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
     [email protected]d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
    Pending Tasks: 
     [email protected]53 
     com.mchange.v2.resourcepool.BasicResourcePool$Ac[email protected] 
Pool thread stack traces: 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main] 
     java.lang.Thread.sleep(Native Method) 
     com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) 
     com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] 
     java.lang.Thread.sleep(Native Method) 
     com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) 
     com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 
    Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] 
     java.lang.Thread.sleep(Native Method) 
     com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask.run(BasicResourcePool.java:1805) 
     com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:547) 

Я использую Hibernate 3.6.2 и C3P0 0.9.1.2 с MySQL. После нескольких часов поиска Google это исключение APPARENT DEADLOCK, похоже, обычно связано с подготовленным кэшированием инструкций. Это моя конфигурация C3P0 в моем hibernate.cfg.xml:

<propertyname="connection.provider_class">org.hibernate.connection.C3P0ConnectionProvider</property> 
<property name="hibernate.c3p0.acquire_increment">5</property> 
<property name="hibernate.c3p0.min_size">5</property> 
<property name="hibernate.c3p0.max_size">60</property> 
<property name="hibernate.c3p0.idle_test_period">120</property> 
<property name="hibernate.c3p0.timeout">180</property>    
<property name="hibernate.c3p0.max_statements">0</property> 

Я не делаю никакого кэширования заявления вообще. Любые намеки на то, что здесь неправильно, будут очень признательны.

ответ

9

Задачами, которые являются деловыми, являются задачи сбора соединений. То есть, c3p0 пытается получить новые подключения из вашей базы данных, а попытки подключения к подключению занимают много времени.

Первое, что я хотел бы сделать, это обновление до 0.9.2.1, которое имеет значительно улучшенные средства для выполнения раунда приобретений Connection в ситуациях, когда попытки приобретения иногда терпят неудачу.

Если это не решит вашу проблему, тогда вам нужно выяснить, почему попытки c3p0 приобрести соединение висят в течение длительных периодов времени: ни преемственно, ни неудача с Исключением.

+0

Кажется, модернизация моего c3p0 до версии 0.9.2.1 сделала трюк! Спасибо @SteveWaldman за подсказку. – corderazo00

+0

Видимо, он не сделал трюк, APPARENT DEADLOCK вернулся ... Есть ли способ контролировать действия c3p0 ближе или на более низком уровне, чтобы понять, почему именно он висит при попытке подключиться? – corderazo00

+0

Может ли удаление кеша веб-сервера (tomcat/work/Catalina) иметь отношение к этому? Я нашел некоторые темы, в которых люди утверждают, что они решили свои проблемы. – corderazo00

1

В моем конкретном случае проблема была связана с конфигурацией сервера, на котором я развернул приложение.

Это было только после распечатки стека моего приложения, что он был повешен, потому что водитель оракула ждет безопасное случайное число генерируется:

Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main] 
    java.io.FileInputStream.readBytes(Native Method) 
    java.io.FileInputStream.read(FileInputStream.java:255) 
    sun.security.provider.SeedGenerator$URLSeedGenerator.getSeedBytes(SeedGenerator.java:539) 
    sun.security.provider.SeedGenerator.generateSeed(SeedGenerator.java:144) 
    sun.security.provider.SecureRandom$SeederHolder.(SecureRandom.java:203) 
    sun.security.provider.SecureRandom.engineNextBytes(SecureRandom.java:221) 
    java.security.SecureRandom.nextBytes(SecureRandom.java:468) 
    oracle.security.o5logon.O5Logon.a(Unknown Source) 
    oracle.security.o5logon.O5Logon.(Unknown Source) 
    oracle.jdbc.driver.T4CTTIoauthenticate.(T4CTTIoauthenticate.java:582) 
    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401) 
    oracle.jdbc.driver.PhysicalConnection.(PhysicalConnection.java:553) 
    oracle.jdbc.driver.T4CConnection.(T4CConnection.java:254) 
    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32) 
    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:528) 
    com.mchange.v2.c3p0.DriverManagerDataSource.getConnection(DriverManagerDataSource.java:134) 
    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) 

Тогда я должен был узнать и понять немного об энтропийном шуме и мог с небольшой помощью помочь моим друзьям Unix, чтобы на одном из серверов не был установлен пакет, который генерирует «шум».

Как уже упоминалось в следующем посте я побежал следующие команды: cat /proc/sys/kernel/random/entropy_avail 23 cat /proc/sys/kernel/random/poolsize 4096

Так там, где слишком мало энтропии доступны для создания защищенного случайного числа.

После установки пакета cat /proc/sys/kernel/random/entropy_avail 4096 Впоследствии у меня не было более очевидных взаимоблокировок, мое приложение могло подключаться к БД.

http://www.usn-it.de/index.php/2009/02/20/oracle-11g-jdbc-driver-hangs-blocked-by-devrandom-entropy-pool-empty/

0

Получил подобную ошибку, как это раньше.

Он также может быть вызван сервером базы данных, блокирующим ваш IP-адрес. Убедитесь, что IP-адрес серверов не заблокирован сервером базы данных/облачным провайдером.

В моем случае пыталась вставить данные в базу данных в облаке с помощью многопоточности и работает только на локальном, но не на сервере (в другой сети).