C3P0 очевидный тупик, когда все потоки пусты? - PullRequest
28 голосов
/ 17 сентября 2010

Я использую C3P0 в качестве пула соединений в Tomcat и вижу очень тревожные ошибки:

2010-09-16 13:25:00,160 [Timer-0] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner  - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@43502400 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
2010-09-16 13:25:01,407 [Timer-0] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner  - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@43502400 -- APPARENT DEADLOCK!!! Complete Status:
  Managed Threads: 10
  Active Threads: 0
  Active Tasks:
  Pending Tasks:
    com.mchange.v2.resourcepool.BasicResourcePool$1RefurbishCheckinResourceTask@6e4151a7
  Pool thread stack traces:
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#6,5,main]
    java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
    java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
    java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
    java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#5,5,main]
    java.lang.Object.wait(Native Method)
    com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread.run(ThreadPoolAsynchronousRunner.java:534)
  Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#4,5,main]
    java.lang.Object.wait(Native Method)

... many more, exact same stack trace

Строка 534:

 while (true) {
   Runnable myTask;
   synchronized ( ThreadPoolAsynchronousRunner.this ) {
     while ( !should_stop && pendingTasks.size() == 0 )
       ThreadPoolAsynchronousRunner.this.wait( POLL_FOR_STOP_INTERVAL ); // <- here
     if (should_stop) ...

Очень похоже, что все потоки простаивают. Они ждут работы. 0 активных тем и только 1 задача для завершения. Есть какие-нибудь подсказки о том, что идет не так?

Вот конфигурация:

ds.setUser(userName);
ds.setPassword(password);
ds.setMaxPoolSize(16);
ds.setMaxConnectionAge(1800);
ds.setAcquireRetryAttempts(4);
ds.setMaxIdleTime(900);
ds.setNumHelperThreads(10);
ds.setCheckoutTimeout(1000);

Ответы [ 11 ]

14 голосов
/ 12 августа 2013

Я только что столкнулся с аналогичной проблемой в отношении базы данных Oracle, но в моем случае значения Managed Thread и Active Thread были одинаковыми.

    Managed Threads: 3
    Active Threads: 3

Для меня это была ошибка аутентификации, но она выглядела как ошибка APPARENT DEADLOCK из-за того, как я проводил аудит входа в систему.

    2013-08-12 11:29:04,910 [Timer-4] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@34996454 -- APPARENT DEADLOCK!!! Creating emergency threads for unassigned pending tasks!
    2013-08-12 11:29:04,914 [Timer-4] WARN  com.mchange.v2.async.ThreadPoolAsynchronousRunner: com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@34996454 -- APPARENT DEADLOCK!!! Complete Status: 
            Managed Threads: 3
            Active Threads: 3
            Active Tasks: 
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@6730b844 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2)
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@2f91ad49 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0)
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@507ac05 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1)
            Pending Tasks: 
                    com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@3aae7ed7
    Pool thread stack traces:
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2,5,main]
                    java.net.SocketInputStream.socketRead0(Native Method)
                    java.net.SocketInputStream.read(SocketInputStream.java:150)
                    java.net.SocketInputStream.read(SocketInputStream.java:121)
                    oracle.net.ns.Packet.receive(Packet.java:300)
                    oracle.net.ns.DataPacket.receive(DataPacket.java:106)
                    oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
                    oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
                    oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
                    oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
                    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
                    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
                    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
                    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
                    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
                    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)
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main]
                    java.net.SocketInputStream.socketRead0(Native Method)
                    java.net.SocketInputStream.read(SocketInputStream.java:150)
                    java.net.SocketInputStream.read(SocketInputStream.java:121)
                    oracle.net.ns.Packet.receive(Packet.java:300)
                    oracle.net.ns.DataPacket.receive(DataPacket.java:106)
                    oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
                    oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
                    oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
                    oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
                    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
                    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
                    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
                    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
                    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
                    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)
            Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1,5,main]
                    java.net.SocketInputStream.socketRead0(Native Method)
                    java.net.SocketInputStream.read(SocketInputStream.java:150)
                    java.net.SocketInputStream.read(SocketInputStream.java:121)
                    oracle.net.ns.Packet.receive(Packet.java:300)
                    oracle.net.ns.DataPacket.receive(DataPacket.java:106)
                    oracle.net.ns.NetInputStream.getNextPacket(NetInputStream.java:315)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:260)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:185)
                    oracle.net.ns.NetInputStream.read(NetInputStream.java:102)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.readNextPacket(T4CSocketInputStreamWrapper.java:124)
                    oracle.jdbc.driver.T4CSocketInputStreamWrapper.read(T4CSocketInputStreamWrapper.java:80)
                    oracle.jdbc.driver.T4CMAREngine.unmarshalUB1(T4CMAREngine.java:1137)
                    oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:290)
                    oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:380)
                    oracle.jdbc.driver.T4CTTIoauthenticate.doOAUTH(T4CTTIoauthenticate.java:760)
                    oracle.jdbc.driver.T4CConnection.logon(T4CConnection.java:401)
                    oracle.jdbc.driver.PhysicalConnection.<init>(PhysicalConnection.java:546)
                    oracle.jdbc.driver.T4CConnection.<init>(T4CConnection.java:236)
                    oracle.jdbc.driver.T4CDriverExtension.getConnection(T4CDriverExtension.java:32)
                    oracle.jdbc.driver.OracleDriver.connect(OracleDriver.java:521)
                    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)
7 голосов
/ 17 сентября 2010

Похоже, вы уже установили соединение из пула и не вернули его вовремя.

C3P0 определяет «кажущиеся взаимоблокировки», когда соединение установлено, но не возвращено в пул в течение тайм-аута обнаружения взаимоблокировки.

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

4 голосов
/ 31 марта 2011

Это решит вашу проблему

ds.setMaxStatements(1000);
ds.setMaxStatementsPerConnection(100); (the maximum number of prepared statments your system can execute on a single connection)

checkout: https://forum.hibernate.org/viewtopic.php?t=947246&highlight=apparent+deadlock+c3p0

Не забудьте закрыть свои заявления после того, как с ними покончено !!

2 голосов
/ 14 августа 2018

Мой комментарий к ответу https://stackoverflow.com/a/18192588/1019307 получил достаточно голосов, чтобы предположить, что это должен быть ответ.

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

1 голос
/ 30 сентября 2018

@ eebbesen, я получил ту же ошибку, что и вы.Я использую Tomcat версии 9.0.6.У меня Hibernate Core версии 5.2.10, Hibernate C3P0 версии 3.6.3 в моем проекте Maven.Мой не был ошибкой аутентификации, а скорее из-за того, что я ранее изменил имя моего компьютера.Это не оказало немедленного влияния на tomcat, но при перезапуске моей машины, когда я попытался снова вызвать tomcat через затмение (Oxygen 2), я больше не мог запускать затмение именно из-за проблемы, которую вы подняли.

Я гуглил это и нашел эту ссылку, которая подтолкнула меня к проблеме:

https://community.oracle.com/thread/339825

, где написано:

Сначала посмотритеесли службы OracleServiceXE и OracleXETNSListener работают.Замените 127.0.0.1 в URL-адресе на IP-адрес или имя вашей машины.Он должен соответствовать хосту, объявленному в файле tnsnames.ora.

Позже в нем упоминается, где найти этот файл tnsnames.ora, и для меня он был здесь:

C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN

Глядя на этот файл tnsnames.ora, я увидел следующее:

XE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = MyMachineName-7)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = XE)
    )
  )

Но недавно я переименовал свою машину в MyMachineName-5.Я изменил 7 на 5 и сохранил файл.Я проверил файл «listener.ora» в этом каталоге, и у него возникла та же проблема:

LISTENER =
  (DESCRIPTION_LIST =
    (DESCRIPTION =
      (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1))
      (ADDRESS = (PROTOCOL = TCP)(HOST = MyMachineName-7)(PORT = 1521))
    )
  )

Я изменил 7 на 5 и сохранил файл.

Затем я открылДиспетчер задач, щелкнул вкладку «Службы» и посмотрел на службы «Oracle».Я сделал перезапуск: OracleXETNSListener, OracleXEClrAgent, OracleServiceXE.Я снова перезапустил tomcat в Eclipse, и на этот раз возникла проблема.

Приложение:

Я также погуглил это:

https://community.oracle.com/thread/2267906

Это заставило меня попробовать:

1) Выключил брандмауэр в Защитнике Windows (уже отключен брандмауэр mcaffee)

2) Запустил sqlplus, чтобы убедиться, что я могу войти с учетными даннымиЯ использовал в своем файле гибернации: hibernate.cfg.xml

C: \ oraclexe \ app \ oracle \ product \ 11.2.0 \ server \ bin \ sqlplus.exe

3) Запущеноярлык на рабочем столе для Oracle Database 11g

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

4) Используя dbVisualizer, я попытался сделатьподключение к Oracle.Это сработало только после того, как я решил проблему с именем файлового компьютера .ora: дважды щелкните соединение и нажмите кнопку «ping server».

0 голосов
/ 20 сентября 2018

У меня внезапно возникла такая же проблема: после того, как я заметил, что тупик присутствует только при запуске моего приложения в режиме отладки (я использую IntelliJ), и это было нормально при работе с обычным запуском, я начал копать его.

Наконец-то я понял, что точка останова блокирует соединение: я не знаю, почему Intellij не «слушал», что приложение проходило через эту точку останова, а где-то зависло из-за точки останова,и это вызывало явную тупиковую ситуацию

После удаления всех точек останова в моем проекте все началось снова гладко.

Надеюсь, это кому-то поможет

0 голосов
/ 26 февраля 2018

Привет, мой друг, просто чтобы прокомментировать, у меня был такой же случай.Я только что сконфигурировал свой проект весеннего спящего режима и обнаружил то же исключение, следует отметить, что в моем проекте все еще нет запроса.

Я решил эту проблему с помощью следующих шагов:

1) Чистый проект: Проект -> Очистить ... 2) Построить проект: Проект -> Построить проект

Я надеюсь, что он работает для вас.

0 голосов
/ 01 апреля 2017

Подобная проблема возникла на сервере glassfish4 при развертывании приложения.Оказалось, это была проблема конфигурации базы данных.Просто убедитесь, что ваши конфигурации подключения к базе данных являются правильными, убедитесь, что имя хоста, указанное в конфигурации, разрешает подключение к базе данных.Попробуйте подключиться к базе данных вручную с настроенным именем пользователя и именем хоста / доменом.При необходимости разрешите пользователю БД подключаться из необходимого домена.Перестройте приложение с правильными настройками БД, а затем разверните его.

0 голосов
/ 03 марта 2016

Мы столкнулись с этой проблемой и решили ее, добавив в конфигурацию C3P0:

<property name="statementCacheNumDeferredCloseThreads" value="1"/>

согласно: это из документа C3P0

0 голосов
/ 28 октября 2015

У меня была та же проблема, но причину было немного трудно определить, поскольку она была вызвана одновременными попытками некоторых ресурсов установить соединение одновременно.

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

public Connection getConnection() throws SQLException {
    if (mCPDS == null) {
        setupPool();
    }

    return mCPDS.getConnection();
}

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

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

public synchronized Connection getConnection() throws SQLException {
    if (mCPDS == null) {
        setupPool();
    }

    return mCPDS.getConnection();
}

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

...