У меня есть 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).
Так есть ли способ закрыть все соединения, когда вся вычислительная работа завершена, и восстановить соединения на следующий денькогда задание будет выполнено снова? Спасибо.
С уважением, Джои