c3p0 как закрыть все соединения с базой данных и заново открыть их при необходимости? - PullRequest
5 голосов
/ 07 января 2012

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

Так есть ли способ закрыть все соединения, когда вся вычислительная работа завершена, и восстановить соединения на следующий денькогда задание будет выполнено снова? Спасибо.

С уважением, Джои

1 Ответ

4 голосов
/ 08 января 2012

Если вы хотите, чтобы все соединения были закрыты, установите minPoolSize и initialPoolSize на 0. Также я бы предложил уменьшить maxIdleTime до меньшего значения, например, 600 (10 минут).Эта комбинация настроек позволит быстро «истощать» пул после завершения работы ваших рабочих.

Вы также можете принудительно закрыть все соединения, используя один из методов reset, представленный в ComboPooledDataSource, но еслиПул настроен правильно, что не нужно.

...