c3p0, как отключить все соединения с базой данных и повторно открыть их, когда это необходимо?

У меня есть 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

5
задан Joey Sun 7 January 2012 в 13:11
поделиться