2012-01-07 25 views
5

Tengo un TimerTask que se ejecuta una vez (aproximadamente 1 o 2 horas) cada día. Y en cada ejecución, creará cientos de subprocesos para hacer algunos cálculos de trabajo para cada tabla en la base de datos MySQL. y uso el c3p0 como el grupo de conexiones de origen de la base de datos (cada hilo obtiene la conexión antes de la computación y cierra la conexión después de la computación). He establecido la configuración del grupo de conexión como abajo,c3p0 cómo cerrar todas las conexiones a la base de datos y volver a abrirlas cuando sea necesario?

cpDs = new ComboPooledDataSource(); 
cpDs.setMinPoolSize(10); 
cpDs.setMaxPoolSize(20); 
cpDs.setMaxStatementsPerConnection(10); 

Durante las pruebas, encontré todas las conexiones de base de datos se perdieron en el funcionamiento del día siguiente, y un montón de "fallo de enlace de comunicaciones debido a excepción subyacente" se muestran en el registro archivo. así que agregué las siguientes configuraciones para probar la conexión antes de usarla.

// 7 hours, less than MYSQL default value - 8 hours 
cpDs.setMaxIdleTime(25200); 
cpDs.setTestConnectionOnCheckout(true); 
cpDs.setPreferredTestQuery("select 1"); 

pero observo que siempre hay 10 conexiones quedarse dormidos Estado/inactivo (vía SQL 'mostrar processlist;') cuando el TimerTask no se está ejecutando, y veo a menudo el famoso "aparente punto muerto !!!" advertencia (que el error todavía está en estado abierto en el proyecto c3p0 http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690).

Entonces, ¿hay alguna manera de cerrar todas las conexiones cuando todo el trabajo de cálculo haya finalizado y reconstruir las conexiones al día siguiente cuando la tarea se realiza nuevamente? Gracias.

Saludos, Joey

Respuesta

3

Si desea que todas las conexiones a cerrar, establecen minPoolSize y initialPoolSize a 0. Además, sugeriría reducir maxIdleTime a un valor más pequeño como 600 (10 minutos). Esta combinación de configuraciones permitirá que el grupo se "drene" rápidamente después de que sus trabajadores hayan terminado.

También puede forzar el cierre de todas las conexiones utilizando uno de los métodos reset expuestos en ComboPooledDataSource, pero si el grupo está configurado correctamente, no debería ser necesario.

+0

Gracias, Rob, ¡tu sugerencia es muy útil! Lo intenté, y todas las conexiones se cerraron después de que pasara el tiempo maxIdleTime. ¡Muy bien! –

Cuestiones relacionadas