2008-08-19 22 views
13

Ho un'installazione di istanza di tomcat ma la connessione di database che ho configurato in context.xml continua a morire dopo periodi di inattività.Java + Tomcat, connessione al database Dying?

Quando controllo i ceppi ottengo il seguente errore:

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: L'ultimo pacchetto ricevuto con successo dal server was68051 secondi fa. L'ultimo pacchetto inviato al server era 68051 secondi , che è più lungo del valore configurato dal server di "wait_timeout". È necessario considerare di scadere e/o verificare la validità della connessione prima di utilizzarla nell'applicazione, aumentare i valori configurati del server per i timeout del client o utilizzare la proprietà di connessione Connector/J 'autoReconnect = true' per evitare questo problema.

Ecco la configurazione in context.xml:

<Resource name="dataSourceName" 
     auth="Container" 
     type="javax.sql.DataSource" 
     maxActive="100" 
     maxIdle="30" 
     maxWait="10000" 
     username="username" 
     password="********" 
     removeAbandoned = "true" 
     logAbandoned = "true" 
     driverClassName="com.mysql.jdbc.Driver" 
     url="jdbc:mysql://127.0.0.1:3306/databasename?autoReconnect=true&amp;useEncoding=true&amp;characterEncoding=UTF-8" /> 

sto usando Autoreconnect = tura come l'errore dice di fare, ma la connessione mantiene morire. Non ho mai visto questo accadere prima.

Ho anche verificato che tutte le connessioni al database vengano chiuse correttamente.

risposta

8

Tomcat Documentation

DBCP utilizza la connessione al database di Giacarta-Commons Pool. Si basa sul numero di componenti Jakarta-Commons:

* Jakarta-Commons DBCP 
* Jakarta-Commons Collections 
* Jakarta-Commons Pool 

Questo attributo può aiutarti.

removeAbandonedTimeout="60" 

sto usando la stessa roba pool di connessioni e sto impostando queste proprietà per evitare che la stessa cosa non si tratta solo configurato mediante Tomcat. Ma se la prima cosa non funziona, prova questi.

testWhileIdle=true 
timeBetweenEvictionRunsMillis=300000 
+0

Bello. Ho impostato i parametri in context.xml e lascerò riposare per 24 ore. Se non funziona, non accetto la risposta. Ma sembra promettente! Grazie! –

0

Non so se la risposta di cui sopra fa fondamentalmente la stessa cosa, ma alcuni dei nostri sistemi di utilizzare la connessione DB circa una volta alla settimana e ho visto che mettiamo a disposizione una bandiera -Otimeout o qualcosa del ordina a mysql per impostare il timeout della connessione.

5

Giusto per chiarire cosa sta causando effettivamente questo. MySQL termina per impostazione predefinita le connessioni aperte dopo 8 ore di inattività. Tuttavia, il pool di connessione del database manterrà le connessioni per un periodo più lungo.

Quindi impostando timeBetweenEvictionRunsMillis = 300000 si sta istruendo il pool di connessioni per eseguire le connessioni e sfrattare e chiudere quelle inattive ogni 5 minuti.

+0

Qual è il nome di questa proprietà? Vorrei ricontrollarlo. "thread_pool_idle_timeout = 60" è tutto ciò che vedo. – mass

+0

@mass non ne ho idea. La mia risposta sopra è di 7 anni e non ho più usato Tomcat o Servlet Resource per alcuni anni.Per quanto ne so, timeBetweenEvictionRunsMillis è una proprietà del tag Resource in context.xml e thread_pool_idle_timeout è una chiave file .property. –

+0

In questo momento, per quanto ne so, l'impostazione del tempo tra EvictionRunsMillis avvia ancora lo sweeper di connessione per il pool di origini dati jdbc. thread_pool_idle_timeout era comunque un parametro MySQL a cui mi riferivo. Dubito che le impostazioni predefinite correnti siano più brevi di 8 ore, ma grazie per aver risposto comunque. Sembra che la soluzione accettata abbia funzionato per l'OP, lo farò. – mass

1

L'opzione removeAbandoned è obsoleta a partire da DBCP 1.2 (sebbene still present nel ramo 1.3). Here è una spiegazione non ufficiale.

Problemi correlati