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>
Я не делаю никаких заявлений о кешировании. Любые намеки на то, что здесь не так, будут с благодарностью.
3 ответа
Задачи, которые снимаются, являются задачами получения соединения. То есть c3p0 пытается получить новые соединения из вашей базы данных, и эти попытки получения соединения занимают много времени.
Первое, что я бы сделал, - это обновление до 0.9.2.1, в котором есть значительно улучшенные средства для выполнения раунда приобретений подключений в ситуациях, когда попытки получения данных иногда терпят неудачу.
Если это не решит вашу проблему, то вам нужно выяснить, почему попытки c3p0 получить соединение зависают на длительные периоды времени: ни с успехом, ни с ошибкой с исключением.
В моем конкретном случае проблема была связана с настройкой сервера, на котором я развернул свое приложение.
Только после распечатки трассировки стека моего приложения оно зависло, потому что драйвер оракула ожидал генерирования безопасного случайного числа:
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
После этого у меня больше не было явных тупиков, мое приложение могло получать соединения с БД.
Получил подобную ошибку, как это раньше.
Это также может быть вызвано тем, что сервер базы данных блокирует ваш IP. Убедитесь, что IP-адреса ваших серверов не заблокированы сервером базы данных / облачным провайдером.
В моем случае, пытался вставить данные в базу данных в облаке с многопоточностью, и он работает только на локальном, но не на сервере (в другой сети).