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).

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

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


person Joey Sun    schedule 07.01.2012    source источник


Ответы (1)


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

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

person Rob H    schedule 07.01.2012
comment
Спасибо, Роб, ваше предложение очень полезно! Я пробовал, и все соединения закрываются после прохождения maxIdleTime. Отлично! - person Joey Sun; 08.01.2012