2012-01-07 6 views
5

Mam TimerTask, który działa jeden raz (około 1 lub 2 godziny) każdego dnia. I przy każdym uruchomieniu stworzy setki wątków, aby wykonać pewne obliczenia dla każdej tabeli w bazie danych MySQL. i używam c3p0 jako puli połączeń źródła bazy danych (każdy wątek otrzymuje połączenie przed obliczeniem i zamyka połączenie po obliczeniu). Ustawić jak poniżej konfiguracji puli połączeń,c3p0 jak zamknąć wszystkie połączenia z bazami danych i ponownie je otworzyć w razie potrzeby?

cpDs = new ComboPooledDataSource(); 
cpDs.setMinPoolSize(10); 
cpDs.setMaxPoolSize(20); 
cpDs.setMaxStatementsPerConnection(10); 

Podczas testów, znalazłem wszystkie połączenia baz danych zostały utracone w następny dzień z rzędu, a wiele „Komunikacji awarii łącza ze względu na podstawową wyjątkiem” były pokazywane w dzienniku plik. więc dodałem następujące konfiguracje, aby przetestować połączenie przed jego użyciem.

// 7 hours, less than MYSQL default value - 8 hours 
cpDs.setMaxIdleTime(25200); 
cpDs.setTestConnectionOnCheckout(true); 
cpDs.setPreferredTestQuery("select 1"); 

ale zauważają, że nie zawsze są 10 połączenia pobyt sypialnych/stan bezczynności (za pośrednictwem SQL „Pokaż processlist;”), gdy TimerTask nie pracuje, a ja często zobaczyć słynny „pozornego impasu !!!” ostrzeżenie (którego błąd nadal znajduje się w stanie otwartym w projekcie c3p0 http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690).

Czy istnieje sposób zamknięcia wszystkich połączeń po zakończeniu wszystkich prac obliczeniowych i ponownego skonstruowania połączeń następnego dnia po ponownym wykonaniu zadania? Dziękuję Ci.

Pozdrawiam, Joey

Odpowiedz

3

Jeśli chcesz wszystkie połączenia, aby zamknąć ustaw minPoolSize i initialPoolSize 0. Ponadto, chciałbym zaproponować zmniejszenie maxIdleTime do mniejszej wartości jak 600 (10 minut). Ta kombinacja ustawień umożliwi puli "drenaż" szybko po zakończeniu pracy.

Można również wymusić zamknięcie wszystkich połączeń przy użyciu jednej z metod reset widocznych w ComboPooledDataSource, ale jeśli pula jest poprawnie skonfigurowana, to nie powinno być konieczne.

+0

Dziękuję, Rob, Twoja sugestia jest bardzo pomocna! Próbowałem go, a wszystkie połączenia są zamknięte po upływie maxIdleTime. Bardzo dobrze! –