C3P0 APPARENT DEADLOCK cuando mi Tomcat se inicia

cuando inicie mi proyecto por tomcat o resin, mi proyecto lanzará el error: APPARENT DEADLOCK

Creo que el error causado por c3p0 no puede conectar mi base de datos, cambio mi xml y sustituyo el nombre de dominio por ip de mi base de datos, y luego el proyecto se inicia.

Utilizo un servicio de escucha antes de que funcione mi c3p0, y puedo obtener el nombre de dominio y la dirección ip correctos, no puedo encontrar el motivo del DESADLOCK DE PADRES.

012-10-22 16:53:04 24344 WARN [Timer-0] com.mchange.v2.async.ThreadPoolAsynchronousRunner:624 - com.mchange.v2.async.ThreadPoolAsynchronousRunner$DeadlockDetector@1e79aa -- APPARENT DEADLOCK!!! Complete Status: Managed Threads: 3 Active Threads: 3 Active Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@723a14 (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@14313ff (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#1) com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@d5f50d (com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#2) Pending Tasks: com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@cb560b com.mchange.v2.resourcepool.BasicResourcePool$AcquireTask@17e107c Pool thread stack traces: Thread[com.mchange.v2.async.ThreadPoolAsynchronousRunner$PoolThread-#0,5,main] java.net.PlainSocketImpl.socketConnect(Native Method) java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333) 

Parece que ha encontrado la causa: tiene problemas con el DNS, por lo que los bashs de buscar su base de datos por locking de nombre, mientras que la conexión a su base de datos por IP está bien. Los mensajes c3p0 que está viendo indican que los bashs de adquirir conexiones de la base de datos están bloqueados (es decir, que no tienen éxito ni fallan con una excepción). Eventualmente, esos colgados de hilos de tasak agotaron el grupo de subprocesos de c3p0, y verán advertencias de APPARENT DEADLOCK.

La configuración sugerida por user1516873, statementCacheNumDeferredCloseThreads, es útil cuando ve que las tareas relacionadas con las declaraciones causan puntos muertos, pero es poco probable que le ayuden en su caso. Está pendiente de los bashs del grupo para adquirir Conexiones de la base de datos.

Lo principal que debe hacer es depurar el problema del DNS en su servidor de aplicaciones web. Pruebe herramientas como nslookup o dig, y vea si puede buscar su servidor de base de datos por nombre, y si los resultados llegan rápidamente o si se cuelga en la búsqueda. Por lo que describe, es muy probable que encuentre un problema allí.

Como se describe en la documentación: http://www.mchange.com/projects/c3p0/ , sección Configuración de la agrupación de estados de cuenta

Si statementCacheNumDeferredCloseThreads es mayor que cero, el grupo de instrucciones diferirá físicamente las declaraciones cerradas (en caché) hasta que su conexión principal no esté en uso por ningún cliente o internamente (por ejemplo, en una prueba) por el propio grupo. Para algunos controladores JDBC (especialmente Oracle), los bashs de cerrar una congelación de la statement si la conexión principal está en uso. El valor predeterminado de este parámetro es 0. Establézcalo en un valor positivo si observa “APPARENT DEADLOCKS” relacionados con las tareas de cierre de la conexión. Casi siempre, ese valor debe ser uno: si necesita más de un subproceso dedicado exclusivamente a la destrucción de sentencias, probablemente debería establecer maxStatements y / o maxStatementsPerConnection en valores más altos para no agitarse rápidamente a través de sentencias almacenadas en caché.