C3p0 APPARENT DEADLOCK исключение

Я продолжаю получать это исключение в моем журнале Tomcat:

com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector run
WARNING: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@76b28200 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 3
    Active Threads: 3
    Active Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@1201fd18 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@408f3be4 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@7ba516d8 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
    Pending Tasks: 
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@137efe53
        com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@766b0524
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>

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


person corderazo00    schedule 07.08.2013    source источник


Ответы (3)


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

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

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

person Steve Waldman    schedule 07.08.2013
comment
Похоже, обновление моего c3p0 до версии 0.9.2.1 помогло! Спасибо @SteveWaldman за подсказку. - person corderazo00; 20.08.2013
comment
По-видимому, это не помогло, ЯВНЫЙ DEADLOCK вернулся ... Есть ли способ отслеживать действия c3p0 ближе или на более низком уровне, чтобы увидеть, почему именно он зависает при попытке установить соединение? - person corderazo00; 22.08.2013
comment
Может ли удаление кеша веб-сервера (tomcat / work / Catalina) иметь какое-либо отношение к этому? Я нашел несколько тем, в которых люди утверждают, что это решило их проблемы. - person corderazo00; 22.08.2013
comment
Горячее повторное развертывание tomcat изобилует противопехотными минами для перманентных утечек памяти с такими библиотеками, как c3p0, которые порождают новые потоки. c3p0-0.9.5-pre4, выпуск которого неизбежен, возможно, даже сегодня, будет иметь некоторые новые настройки для предотвращения этих утечек, установите для новых параметров конфигурации PrivilegeSpawnedThreads значение true и contextClassLoaderSource для библиотеки. возможно, подождите день или два и попробуйте! - person Steve Waldman; 22.08.2013
comment
Я полностью согласен со Стивом, горячее переделывание кота действительно близко к русской рулетке. Если вам повезло с предложенными вариантами, расскажите, пожалуйста, результаты, мне очень интересно. - person sataniccrow; 19.11.2013
comment
В нашем случае это было заблокировано для нашего сервера от связи с сервером MySQL. com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: отказ канала связи Последний пакет, успешно отправленный на сервер, был 0 миллисекунд назад. Драйвер не получил пакетов от сервера. - person M. Rizzo; 09.12.2016

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

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

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/

person Gus Vargas    schedule 06.01.2016

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

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

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

person simple    schedule 02.09.2016