Nelle tue proprietà di configurazione hai usato la proprietà c3p0 maxIdleTime, ma le proprietà c3p0 sono configurate usando c3p0.
prefisso o hibernate.c3p0.
. Tieni presente che abilitando uno qualsiasi dei c3p0
properties abilita automaticamente il provider di connessione corrispondente tramite l'euristica di ibernazione. Nel registro non si vede che stai usando c3p0. Se le origini dati non sono configurate, Hibernate utilizzerà hibernate.connection.provider_class org.hibernate.connection.DriverManagerConnectionProvider
. Questo provider di connessione ha un pool di connessioni rudimentale integrato per il quale puoi impostare un hibernate.connection.pool_size
, ma viene utilizzato solo per scopi di sviluppo. Non usarlo mai nell'ambiente di produzione.
Potresti avere infinite discussioni sull'argomento Come riparare java.net.SocketException:pipe rotta . Dopo un po' ti accorgerai di essere rimasto aperto connessioni nel pool, che vengono improvvisamente chiuse dall'altra parte per i seguenti motivi:
- Firewall o router possono limitare le connessioni inattive (il protocollo client/server MySQL non esegue il ping).
- Il server MySQL potrebbe chiudere le connessioni inattive che superano il
wait_timeout
ointeractive_timeout
soglia.
Per aiutare a risolvere questi problemi, è possibile utilizzare i seguenti suggerimenti:
- Viene utilizzata una versione recente (5.1.13+) del driver JDBC.
- Assicurati che
wait_timeout
einteractive_timeout
sono impostati sufficientemente alti. Controlla seinteractiveClient
viene utilizzato. - Assicurati che
tcpKeepalive
è abilitato. - Assicurati che le impostazioni di timeout del firewall o del router configurabili consentano il tempo di inattività della connessione massimo previsto.
- Assicurati che le connessioni siano valide se utilizzate dal pool di connessioni. Utilizza una query che inizi con
/* ping */
per eseguire un ping leggero invece di una query completa. Nota, la sintassi del ping deve essere esattamente come specificata qui. - Convalida esplicitamente la connessione prima di utilizzarla se la connessione è rimasta inattiva per un periodo di tempo prolungato.
- Ridurre al minimo la durata in cui un oggetto di connessione rimane inattivo mentre viene eseguita un'altra logica dell'applicazione.
Per rispettare alcune di queste opzioni, è meglio utilizzare un pool di connessioni che puoi utilizzare con Hibernate. Hibernate supporta commons-dbcp, c3p0 e proxool. Inoltre è possibile configurare l'origine dati JNDI sul server Web da utilizzare con l'ibernazione, ha un pool di connessioni. Vedi Capitolo 7 Pool di connessioni con connettore/J .
Se ti piace configurare Hibernate con c3p0 dovresti leggere questo Come configurare il pool di connessioni C3P0 . Per la configurazione di esempio dbcp dovresti controllare questo post MySQL, Hibernate e Broken Pipe Exception . Qualunque pool di connessioni utilizzerai dipende da te.