Si dovrebbe davvero andare per il collegamento C3P0 pool: http://www.mchange.com/projects/c3p0/index.html#hibernate-specific
C'è una sezione nella documentazione C3P0 su questo argomento: http://www.mchange.com/projects/c3p0/index.html#configuring_recovery
In primo luogo è necessario configurare correttamente c3p0, che in caso di utilizzo di sospensione deve accadere nel file c3p0.properties.
Nei tuoi c3p0.properties mettere queste proprietà per riprovare a riconnettersi a tempo indeterminato ogni 3 secondi quando il database è giù:
c3p0.acquireRetryAttempts = 0
c3p0.acquireRetryDelay = 3000
c3p0.breakAfterAcquireFailure = false
Inoltre, per evitare connessioni interrotte sdraiato in piscina a tempo indeterminato, utilizzare la gestione dell'età collegamento:
c3p0.maxConnectionAge = 6000
c3p0.maxIdleTime = 6000
c3p0.maxIdleTimeExcessConnections = 1800
c3p0.idleConnectionTestPeriod = 3600
Questi possono essere molto costoso, ma utile se sopra non è abbastanza:
c3p0.testConnectionOnCheckout = true
c3p0.preferredTestQuery = SELECT 1;
Si consiglia inoltre di controllare le perdite di connessione che impediscono il recupero:
c3p0.debugUnreturnedConnectionStackTraces = true
E, infine, assicurarsi che C3P0 è collegato correttamente con Hibernate, attivare la registrazione di debug per il pacchetto "com.mchange" e vedere se C3P0 dice hai qualcosa su di sé. Dovrebbe indicare le proprietà di configurazione che vengono caricate, quindi vedere se è tutto lì.
Spero che questo aiuti.
Sì, questo è stato il mio primo passo. Ma non ha funzionato. Ho fatto tutto quello di cui stai parlando ma senza risultato. Il tester del pool di connessione C3p0 non viene chiamato se DB non è attivo. Se DB sta funzionando e ho avviato l'applicazione quando anche il tester sta funzionando, vedo che è in grado di verificare lo stato della connessione. Ma voglio sapere cosa fare nel caso in cui DB non funziona. Intendevo dire che l'applicazione ha provato a crare un pool di connessioni ma senza successo, dopo qualche tempo proverà a farlo ancora una volta. – Andrey
Se il DB è inattivo, riproverà per acquisire i tempi di riavvio automatico, con un ritardo di acquireRetryDelay tra ogni tentativo e dopo il risultato sarà probabilmente un'eccezione. –
Sì, questo è quello che vedo. Hibernate prova a riconnettere i tempi di acquireRetryAttempts con il ritardo acquireRetryDelay ma dopo non ci sono eccezioni. E non capisco come capire che Hibernate è connesso o meno a DB. – Andrey