2011-01-18 14 views
6

Qualcuno conosce un modo per ristabilire/riprovare di nuovo la connessione in stato di ibernazione. Intendo ad esempio: il DB remoto è inattivo e avvio la mia applicazione. Hibernate non è in grado di stabilire una connessione. fallisce. Ma l'applicazione non è chiusa. C'è un modo per dire che ibernare provi ancora una volta per stabilire una connessione?Ripristina connessione Hibernate

Grazie in anticipo

risposta

1

C3P0 è l'implementazione connessione pool interno per sospensione.

Add "hibernate.connection.provider_class = org.hibernate.connection.C3P0ConnectionProvider" nel file di proprietà di Hibernate. Creare un file c3p0.properties impostando i parametri di conseguenza. Questo file & c3p0-x.jar deve essere in classpath.

c3p0.properties

  • c3p0.idleConnectionTestPeriod: Se questo è un numero maggiore di 0, c3p0 testall connessioni inattive, ma pooled incontrollate-out, ogni questo numero di secondi.

  • c3p0.testConnectionOnCheckout: utilizzare solo se necessario. Costoso. Se true, verrà eseguita un'operazione ad ogni checkout di connessione per verificare che la connessione sia valida. Scelta migliore: verifica periodicamente le connessioni usando idleConnectionTestPeriod.

ci sono diverse altre proprietà che possono essere configurate in hibernate.properties & c3p0.properties.

+0

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

+0

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

+0

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

18

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.

0

Può essere, si tenta di chiamare il metodo .getCurrentSession() invece .openSession()?

Se la connessione cade, è necessario stabilirne una nuova.

Spero che questo aiuti.