C3P0 aparente deadlock quando os threads estão todos vazios?

Estou usando o C3P0 como um pool de conexão no Tomcat, e estou vendo erros muito preocupantes:

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 

A linha 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) ... 

Parece muito com todos os tópicos estão ociosos. Eles estão esperando pelo trabalho. 0 encadeamentos ativos e apenas 1 tarefa para concluir. Alguma pista sobre o que está errado?

Aqui está a configuração:

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

Acabei de passar por um problema semelhante em um database Oracle, mas no meu caso, as contagens de Active Thread Managed Thread e Active Thread eram as mesmas.

  Managed Threads: 3 Active Threads: 3 

Para mim, na verdade, foi um erro de autenticação, mas apareceu como o erro APPARENT DEADLOCK devido à maneira como eu estava fazendo a auditoria de login.

  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.(PhysicalConnection.java:546) oracle.jdbc.driver.T4CConnection.(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.(PhysicalConnection.java:546) oracle.jdbc.driver.T4CConnection.(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.(PhysicalConnection.java:546) oracle.jdbc.driver.T4CConnection.(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) 

Parece que você já adquiriu uma conexão do pool e não a retorna a tempo.

C3P0 determina “deadlocks aparentes” quando uma conexão é adquirida, mas não retornada ao pool dentro do tempo limite de detecção de deadlock.

Se você mover a aquisição de conexão para mais perto da “ação” e retorná-la imediatamente ao pool após o término do trabalho do database, essa mensagem desaparecerá.

Isto irá resolver o seu problema

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

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

Lembre-se de fechar suas declarações depois de terminar com elas !!

Eu tive o mesmo problema, mas a causa foi um pouco difícil de detectar, pois foi causada por alguns resources simultâneos tentando adquirir uma conexão ao mesmo tempo.

Como você pode ler se o pool não foi inicializado, o código fornecido para o init chama uma function de configuração.

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

O problema era que muitos resources tentavam adquirir a conexão no começo do programa, então mais do que um estava instanciando o pool causando o seu problema depois de um tempo.

A solução era apenas declarar o método sincronizado para manter fora outros resources enquanto um chamava o método e ele ainda está dentro instanciando o pool por exemplo.

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

Isso pode ser um erro de design para não usar um singleton, mas corrige o problema sem algum desempenho.

Eu tive o mesmo problema (não consegui detectar) resolvido fechando corretamente instâncias de Statement e Resultset (de alguma forma não divulgadas):

 String SQL = "SELECT 1"; try { con = DriverManager.getConnection(host, userName, userPassword); stmt = con.prepareStatement(SQL, ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE); try { rs = stmt.executeQuery(SQL); try { rs.next(); // ... } finally { rs.close(); } } finally { stmt.close(); } } catch (SQLException ex) { Logger.getLogger(MyClass.class.getName()).log(Level.SEVERE, null, ex); } 

Oi meu amigo só para comentar, eu tive o mesmo caso. Acabei de configurar o meu projeto eclipse de hibernação de primavera e mostrou a mesma exceção, deve-se notar que o meu projeto ainda não tem qualquer consulta.

Resolvi esse problema com as etapas abaixo:

1) Projeto limpo: Projeto -> Limpar … 2) Construir projeto: Projeto -> Construir Projeto

Espero que funcione para você.

Meu comentário sobre a resposta https://stackoverflow.com/a/18192588/1019307 recebeu votos suficientes para sugerir que deveria ser uma resposta.

Recebi este erro porque não consegui passar pelo firewall para o servidor de database. Verifique para ver se esse é o seu problema.

Acabei de ter o mesmo problema de repente: depois de perceber que o deadlock estava presente apenas ao iniciar meu aplicativo no modo de debugging (estou usando o IntelliJ) e foi bom quando executando com execução normal, comecei a cavar.

Eu finalmente descobri que um ponto de interrupção estava bloqueando a conexão: Eu não sei porque Intellij não “escutou” que o aplicativo estava passando por esse ponto de interrupção, mas foi enforcado em algum lugar por causa de um ponto de interrupção, e isso estava causando deadlock appartent

Depois de remover todos os pontos de interrupção no meu projeto, tudo começou a ficar tranquilo novamente.

Espero que isso ajude alguém

@eebbesen, recebi o mesmo erro que você. Eu estou executando o Tomcat versão 9.0.6. Eu tenho hibernate core ver 5.2.10, hibernate c3p0 ver 3.6.3 no meu projeto maven. O meu não foi um erro de autenticação, mas sim devido a eu ter alterado anteriormente o nome do meu computador. Isso não teve um efeito imediato no tomcat, mas após o reinício da minha máquina, quando tentei ativar o tomcat novamente via eclipse (Oxygen 2), não pude mais iniciar o eclipse devido exatamente ao problema que você levantou.

Eu pesquisei isso e encontrei este link, o que me levou ao assunto:

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

onde diz:

Primeiro, veja se os serviços OracleServiceXE e OracleXETNSListener estão em execução. Substitua 127.0.0.1 na URL, com o IP ou o nome da sua máquina. Ele deve corresponder ao host declarado no arquivo tnsnames.ora.

Mais tarde, ele menciona onde encontrar esse arquivo tnsnames.ora e, para mim, estava aqui:

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

Olhando este arquivo tnsnames.ora, eu vi isto:

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

Mas eu tinha recentemente renomeado minha máquina para MyMachineName-5. Eu mudei o 7 para um 5 e salvei o arquivo. Eu verifiquei o arquivo “listener.ora” neste diretório, e ele tinha o mesmo problema:

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

Eu mudei o 7 para um 5 e salvei o arquivo.

Em seguida, abri o Gerenciador de Tarefas, cliquei na guia “Serviços” e examinei os serviços “Oracle”. Eu reiniciei em: OracleXETNSListener, OracleXEClrAgent, OracleServiceXE. Eu fui reiniciar o tomcat no eclipse novamente, e desta vez agora havia problema.

Apêndice:

Eu também pesquisei isso:

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

Isso me levou a tentar:

1) Desligou o firewall no Windows Defender (já desligado firewall mcaffee)

2) Iniciei o sqlplus para ter certeza que eu poderia logar com as credenciais que eu estava usando no meu arquivo de hibernação: hibernate.cfg.xml

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

3) Iniciou o atalho da área de trabalho para o Oracle Database 11g

Isso falhou para mim mesmo depois de eu ter resolvido a questão do nome da máquina, algo que ainda tenho que investigar.

4) Usando o dbVisualizer, tentei fazer uma conexão com o Oracle. Isso só funcionou depois que resolvi o problema do nome da máquina do arquivo .ora: clique duas vezes na conexão e clique no botão “ping server”.

Nós nos deparamos com esse problema e o resolvemos adicionando isso na configuração do C3P0:

  

como por: isso do doc C3P0

Problema semelhante foi encontrado no servidor glassfish4 durante a implantação do aplicativo. Aconteceu que era um problema de configuração do database. Apenas certifique-se de que as configurações de conectividade do database sejam adequadas, verifique se o nome do host fornecido na configuração permite a conexão com o database. Tente conectar-se ao database manualmente com o nome de usuário configurado e o nome do host / domínio. Se necessário, permita que o usuário do db conecte-se ao domínio necessário. Reconstrua o aplicativo com as configurações corretas de db e, em seguida, implemente-o.