Domanda

Ho una configurazione di istanza Tomcat ma la connessione al database che ho configurato context.xml continua a morire dopo periodi di inattività.

Quando controllo i log ottengo il seguente errore:

com.mysql.jdbc.Exceptions.jdbc4.CommunicationsException:L'ultimo pacchetto ricevuto correttamente dal server è stato di 68051 secondi fa.L'ultimo pacchetto inviato correttamente al server è durato 68051 secondi ago, che è più lungo del valore configurato dal server di 'wait_timeout'.Dovresti prendere in considerazione la scadenza e/o il test validità della connessione prima dell'uso nell'applicazione, aumentando il valori configurati dal server per i timeout del client o utilizzando il comando Connector/J proprietà di connessione '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=true come dice l'errore, ma la connessione continua a interrompersi.Non l'ho mai visto accadere prima.

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

È stato utile?

Soluzione

Documentazione Tomcat

DBCP utilizza il pool di connessione al database Jakarta-Commons.Si basa sul numero di componenti Jakarta-Commons:

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

Questo attributo può aiutarti.

removeAbandonedTimeout="60"

Sto utilizzando gli stessi elementi di pooling delle connessioni e sto impostando queste proprietà per impedire che la stessa cosa non sia configurata tramite Tomcat.Ma se la prima cosa non funziona, prova questi.

testWhileIdle=true
timeBetweenEvictionRunsMillis=300000

Altri suggerimenti

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

Pertanto, impostando timeBetweenEvictionRunsMillis=300000 stai indicando al pool di connessioni di eseguire le connessioni ed eliminare e chiudere quelle inattive ogni 5 minuti.

L'opzione rimuoviAbandoned è deprecata a partire da DBCP 1.2 (tuttavia ancora presente nel ramo 1.3). Quiè una spiegazione non ufficiale.

Non so se la risposta sopra fa sostanzialmente la stessa cosa, ma alcuni dei nostri sistemi utilizzano la connessione DB circa una volta alla settimana e ho visto che forniamo un flag -Otimeout o qualcosa del genere a mysql per impostare la connessione tempo scaduto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top