2010-09-16 10 views
26

estoy usando C3P0 como una agrupación de conexiones en Tomcat, y estoy teniendo errores muy preocupantes:C3P0 aparente interbloqueo cuando los hilos están todos vacíos?

2010-09-16 13:25:00,160 [Timer-0] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner - com[email protected]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[email protected]43502400 -- APPARENT DEADLOCK!!! Complete Status: 
    Managed Threads: 10 
    Active Threads: 0 
    Active Tasks: 
    Pending Tasks: 
    com.mchange.[email protected]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 

línea 534 es:

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

Se parece mucho a todos los hilos están ocioso. Están esperando por trabajo. 0 hilos activos, y solo 1 tarea para completar. ¿Alguna pista sobre lo que está pasando mal?

Aquí está la configuración:

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

¿Pudo resolver su problema? (Sé que ha pasado mucho tiempo) – Ittai

+0

@Ittai: no, pero finalmente desapareció. No hay idea de qué exactamente lo solucionó :-( –

Respuesta

6

Esto suena como que ya ha adquirido una conexión de la agrupación y no regresar a tiempo.

C3P0 determina "aparentes interbloqueos" cuando se adquiere una conexión pero no se devuelve al grupo dentro del tiempo de espera de detección de interbloqueo.

Si mueve la adquisición de la conexión más cerca de la "acción" y la devuelve inmediatamente al grupo después de que la base de datos haya finalizado, este mensaje desaparecerá.

+2

La documentación dice que setMaxAdministrativeTime está predeterminado en 0 (es decir, para siempre). Además, ¿por qué debería tener que devolver una conexión a un grupo en un límite de tiempo fijo? Lo he comprobado; debería ser mío todo el tiempo que lo necesite ... ¡y aunque no sea así, no es un punto muerto! –

+1

Tienes razón, es por eso que la ADVERTENCIA dice punto muerto APARENTE. Y por cierto, utilizas un grupo de conexiones para que lo hagas no es necesario que mantenga la conexión mientras no lo use –

+1

Claro, pero el lugar en cuestión podría estar en una transacción de larga duración, durante la cual no puede liberarlo –

0

yo tenía la misma (no fue capaz de detectar) problema resuelto mediante el cierre correctamente instancias declaración y de resultados (de alguna manera dejaron sin cerrar):

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); 
} 
11

que acaba de experimentar un problema similar en contra de una base de datos Oracle, pero en mi el caso Managed Thread y Active Thread fueron los mismos.

Managed Threads: 3 
    Active Threads: 3 

Para mí fue realmente un error de autenticación, pero apareció como el error APPARENT DEADLOCK por la forma en que estaba haciendo la auditoría de inicio de sesión.

2013-08-12 11:29:04,910 [Timer-4] WARN com.mchange.v2.async.ThreadPoolAsynchronousRunner: com[email protected]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[email protected]34996454 -- APPARENT DEADLOCK!!! Complete Status: 
      Managed Threads: 3 
      Active Threads: 3 
      Active Tasks: 
        [email protected]44 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) 
        [email protected]49 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) 
        [email protected]5 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) 
      Pending Tasks: 
        [email protected]d7 
    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) 
+6

¡Qué estimulante! Estaba recibiendo este error después de algunos cambios arquitectónicos importantes, así que pensé que lo había jodido. Donde la verdadera razón estaba relacionada con su respuesta, ¡porque no pude pasar el cortafuegos al servidor de la base de datos! – HankCa

+0

Tenía el mismo problema ahora. De nuevo debido a la regla de firewall. @HankCa gracias por el liderazgo. –

+0

100% perfecto para mí, es un grupo de seguridad. – Gman

0

que he tenido el mismo problema, pero la causa era un poco difícil de detectar, ya que fue causado por algunos recursos simultáneos tratando de adquirir una conexión al mismo tiempo.

Como puede leer si el grupo no se ha inicializado, el código proporcionado para iniciarlo invocando una función de configuración.

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

    return mCPDS.getConnection(); 
} 

El problema era que muchos recursos estaban tratando de adquirir la conexión al inicio del programa por lo que más de uno fue crear instancias de la piscina causando su problema después de un tiempo.

La solución fue simplemente para declarar el método sincronizado para mantener a salvo otros recursos mientras uno ha llamado al método y todavía está dentro de instanciar el grupo, por ejemplo.

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

    return mCPDS.getConnection(); 
} 

esto puede ser un error de diseño para no usar un producto único, pero corrige el problema que carece de algo de rendimiento.

-1

nos encontramos con este problema y lo resolvió mediante la adición de esto a la configuración C3P0:

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

según: this from the C3P0 doc

-1

problema similar se encontró en el servidor glassfish4 durante la implementación de la aplicación. Resultó que era un problema de configuración de la base de datos. Solo asegúrese de que las configuraciones de conectividad de su base de datos sean las adecuadas, verifique que el nombre de host proporcionado en la configuración permita la conexión a la base de datos. Intente conectarse a la base de datos manualmente con el nombre de usuario configurado y el nombre de host/dominio. Si es necesario, permita que el usuario de db se conecte desde el dominio requerido. Reconstruya la aplicación con las configuraciones correctas de db y luego impleméntela.

0

Hola mi amigo solo para comentar, tuve el mismo caso. Acabo de configurar mi proyecto Spring-Hibernate Eclipse y mostré la misma excepción, debe tenerse en cuenta que mi proyecto aún no tiene ninguna consulta.

resolví ese problema con los pasos siguientes:

1) Limpiar proyecto: Proyecto -> Limpiar ... 2) Construir proyecto: Proyecto -> Generar proyecto

espero que funcione para tú.

Cuestiones relacionadas