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
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! –