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.