maxstatements max_idle_time example combopooleddatasource java connection-pooling c3p0

java - max_idle_time - hibernate connection pool size



C3P0 aparente interbloqueo cuando los hilos están vacíos? (11)

Estoy usando C3P0 como grupo de conexiones en Tomcat, y veo errores muy 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

La 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 que todos los hilos están inactivos. Están esperando el trabajo. 0 hilos activos, y solo 1 tarea para completar. ¿Alguna pista sobre qué está 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);


@eebbesen, recibí el mismo error que tú. Estoy ejecutando Tomcat versión 9.0.6. Tengo hibernate core ver 5.2.10, hibernate c3p0 ver 3.6.3 en mi proyecto maven. El mío no fue un error de autenticación, sino porque cambié el nombre de mi computadora anteriormente. Esto no tuvo un efecto inmediato en Tomcat, pero al reiniciar mi máquina, cuando intenté volver a mostrar Tomcat nuevamente a través de Eclipse (Oxygen 2), ya no pude iniciar Eclipse debido exactamente al problema que surgió.

Busqué en Google y encontré este enlace, que me indicó el problema:

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

En donde dice:

Primero verifique si los servicios OracleServiceXE y OracleXETNSListener se están ejecutando. Reemplace 127.0.0.1 en la url, con la IP o el nombre de su máquina. Debe coincidir con el host declarado en el archivo tnsnames.ora.

Más tarde menciona dónde encontrar este archivo tnsnames.ora, y para mí fue aquí:

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

Mirando este archivo tnsnames.ora, vi esto:

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

Pero recientemente había cambiado el nombre de mi máquina a MyMachineName-5. Cambié el 7 a un 5 y guardé el archivo. Revisé el archivo "listener.ora" en este directorio, y tenía el mismo problema:

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

Cambié el 7 a un 5 y guardé el archivo.

Luego abrí el Administrador de tareas, hice clic en la pestaña "Servicios" y miré los servicios de "Oracle". Hice un reinicio en: OracleXETNSListener, OracleXEClrAgent, OracleServiceXE. Fui a reiniciar Tomcat en eclipse de nuevo, y esta vez ahora había un problema.

Apéndice:

También busqué en Google esto:

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

Esto me llevó a probar:

1) Desactivó el firewall en Windows Defender (ya desactivado mcaffee firewall)

2) Inicié sqlplus para asegurarme de que pudiera iniciar sesión con las credenciales que estaba usando en mi archivo de hibernación: hibernate.cfg.xml

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

3) Se inició el acceso directo del escritorio a Oracle Database 11g.

Sin embargo, esto me falló incluso después de haber solucionado el problema del nombre de la máquina, algo que todavía tengo que analizar.

4) Usando dbVisualizer, intenté hacer una conexión a Oracle. Esto solo funcionó después de haber resuelto el problema con el nombre de la máquina del archivo .ora: haga doble clic en la conexión y haga clic en el botón "Servidor ping".


Acabo de experimentar un problema similar contra una base de datos Oracle, pero en mi caso, el recuento de Active Thread Managed Thread y Active Thread era el mismo.

Managed Threads: 3 Active Threads: 3

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

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)


Acabo de tener el mismo problema de repente: después de notar que el interbloqueo estaba presente solo al iniciar mi aplicación en modo de depuración (estoy usando IntelliJ) y estaba bien cuando se ejecutaba con ejecución normal, comencé a excavarlo.

Finalmente me di cuenta de que un punto de interrupción estaba bloqueando la conexión: no sé por qué Intellij no "escuchó" que la aplicación estaba pasando por ese punto de interrupción, pero fue bloqueado en algún lugar debido a un punto de interrupción, y esto estaba causando un estancamiento aparente

Después de eliminar todos los puntos de interrupción en mi proyecto, todo comenzó de nuevo sin problemas.

Espero que esto ayude a alguien



Esto suena como que ya ha adquirido una conexión del grupo y no la devuelve a tiempo.

C3P0 determina "interbloqueos aparentes" 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 conexión más cerca de la "acción" y la devuelve inmediatamente al grupo después de que se realiza el trabajo de la base de datos, este mensaje desaparecerá.


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

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

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

El problema era que muchos recursos intentaban adquirir la conexión al principio del programa, por lo que más de uno estaba creando una instancia de la agrupación causando su problema después de un tiempo.

La solución fue simplemente declarar el método sincronizado para mantener fuera a otros recursos, mientras que uno ha llamado al método y aún está dentro, por ejemplo, creando una instancia de la agrupación.

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

Esto puede ser un error de diseño por no usar un singleton pero soluciona el problema que carece de rendimiento.


Hola amigo mío, solo para comentar, tuve el mismo caso. Acabo de configurar mi proyecto de eclipse de hibernación de primavera y mostré la misma excepción, debo tener en cuenta que mi proyecto aún no tiene ninguna consulta.

Resolví ese problema con los siguientes pasos:

1) Proyecto limpio: Proyecto -> Limpiar ... 2) Proyecto de compilación: Proyecto -> Proyecto de compilación

Espero que te funcione.


Mi comentario sobre la respuesta https://.com/a/18192588/1019307 recibió suficientes votos para sugerir que debería ser una respuesta.

Recibí este error porque no pude pasar del firewall al servidor de la base de datos. Compruebe si ese es su problema.


Nos encontramos con este problema y lo resolvimos agregando esto a la configuración de C3P0:

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

según: esto del documento C3P0


Se encontró un problema similar en el servidor glassfish4 al implementar 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 la base de datos sean correctas, 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 db se conecte desde el dominio requerido. Reconstruye la aplicación con las configuraciones de db correctas y luego desplázala.


Tuve el mismo (no se pudo detectar) el problema resuelto al cerrar correctamente las instancias de Statement y Resultset (de alguna manera no se han cerrado):

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