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