У меня есть TimerTask, который запускается один раз (около 1 или 2 часов) каждый день. И при каждом запуске он будет создавать сотни потоков для выполнения некоторой вычислительной работы для каждой таблицы в базе данных MySQL. и я использую c3p0 в качестве пула соединений с источником базы данных (каждый поток получает соединение перед вычислением и закрывает соединение после вычисления). Я установил конфигурацию пула соединений, как показано ниже,
cpDs = new ComboPooledDataSource();
cpDs.setMinPoolSize(10);
cpDs.setMaxPoolSize(20);
cpDs.setMaxStatementsPerConnection(10);
Во время тестирования я обнаружил, что все соединения с базой данных были потеряны на следующий день, и в файле журнала было показано много «сбоев связи из-за основного исключения». поэтому я добавил следующие конфигурации, чтобы проверить соединение перед его использованием.
// 7 hours, less than MYSQL default value - 8 hours
cpDs.setMaxIdleTime(25200);
cpDs.setTestConnectionOnCheckout(true);
cpDs.setPreferredTestQuery("select 1");
но я наблюдаю, что всегда есть 10 соединений, которые остаются в спящем/бездействующем состоянии (через SQL 'show processlist;'), когда TimerTask не работает, и я часто вижу знаменитый «ВИДИМЫЙ ТУБЛОК!!!» предупреждение (что ошибка все еще находится в открытом состоянии в проекте c3p0 http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690).
Итак, есть ли способ закрыть все соединения, когда вся вычислительная работа будет завершена, и восстановить соединения на следующий день, когда задача будет выполнена снова? Спасибо.
С уважением, Джоуи