2012-01-07 10 views
5

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

risposta

3

Se vuoi tutte le connessioni per chiudere, impostare minPoolSize e initialPoolSize a 0. Inoltre, vorrei suggerire la riduzione maxIdleTime ad un valore più piccolo come 600 (10 minuti). Questa combinazione di impostazioni consentirà al pool di "drenare" rapidamente una volta terminati i lavoratori.

È inoltre possibile forzare la chiusura di tutte le connessioni utilizzando uno dei metodi reset esposti in ComboPooledDataSource, ma se il pool è configurato correttamente non dovrebbe essere necessario.

+0

Grazie, Rob, il tuo suggerimento è molto utile! L'ho provato e tutte le connessioni sono chiuse dopo che è passato il maxIdleTime. Molto bene! –

Problemi correlati