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
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! –