Ho un TimerTask che viene eseguito una volta (circa 1 o 2 ore) ogni giorno. E a ogni esecuzione, creerà centinaia di thread per fare del lavoro di calcolo per ogni tabella nel database MySQL. e io uso il c3p0 come pool di connessione all'origine del database (ogni thread ottiene la connessione prima di calcolare e chiude la connessione dopo il calcolo). Ho impostato la configurazione di pool di connessioni, come di seguito,c3p0 come arrestare tutte le connessioni al database e riaprirle quando necessario?
cpDs = new ComboPooledDataSource();
cpDs.setMinPoolSize(10);
cpDs.setMaxPoolSize(20);
cpDs.setMaxStatementsPerConnection(10);
Durante il test, ho trovato tutte le connessioni al database sono stati persi nella corsa del giorno successivo, e un sacco di "Communications errore di collegamento a causa di eccezione sottostante" sono stati mostrati nel registro file. quindi ho aggiunto le seguenti configurazioni per testare la connessione prima di usarla.
// 7 hours, less than MYSQL default value - 8 hours
cpDs.setMaxIdleTime(25200);
cpDs.setTestConnectionOnCheckout(true);
cpDs.setPreferredTestQuery("select 1");
ma osservo che ci sono sempre 10 connessioni rimanere a pelo/stato di inattività (via SQL 'show processlist;') quando il TimerTask non è in esecuzione, e vedo spesso il famoso "stallo APPARENTE !!!" avviso (che il bug è ancora in stato aperto nel progetto c3p0 http://sourceforge.net/tracker/?func=detail&aid=3432139&group_id=25357&atid=383690).
Quindi c'è un modo per chiudere tutte le connessioni quando tutto il lavoro di calcolo è finito e ricostruire le connessioni nel giorno successivo quando l'attività viene eseguita di nuovo? Grazie.
saluti, Joey
Grazie, Rob, il tuo suggerimento è molto utile! L'ho provato e tutte le connessioni sono chiuse dopo che è passato il maxIdleTime. Molto bene! –