Domanda

Ho installato Tomcat di utilizzare un pool di connessioni ancora dopo il timeout di MySQL sui collegamenti i collegamenti precedentemente aperte in piscina non vengono aperti. Ecco ciò che il mio file context.xml appare come:

<Resource name="jdbc/hpsgDB" auth="Container" type="javax.sql.DataSource"
           maxActive="5" maxIdle="3" maxWait="10000"
           username="uname" password="password" driverClassName="com.mysql.jdbc.Driver"
           url="jdbc:mysql://localhost:3306/hpsgdb?autoReconnect=true"/>

Come potete vedere ho incluso Autoreconnect come vero ma non è così. Ho controllato il processo nel database dopo 8 ore, che è ciò che il tempo fuori è impostato.

È stato utile?

Soluzione

Prova ad aggiungere un attributo di query di convalida. Questo dovrebbe avere l'effetto di chiusura automatica e riaprendo la connessione dopo un timeout così:

validationQuery="SELECT 1"

Altri suggerimenti

In primo luogo, sbarazzarsi della proprietà autoReconnect. Non hai bisogno di questo con un pool di connessioni e potrebbero provocare problemi.

In secondo luogo, in modo che si Chiudi tutte le risorse (Connection, Statement e ResultSet) nel codice JDBC nel blocco finally.

Non sono sicuro se questo vale nel tuo caso, ma un errore comune tra i principianti è che sembrano pensare che non è necessario chiudere le risorse in caso di connessioni in pool. Questo è falso. Una connessione in pool è un wrapper (decoratore) intorno ad una connessione che ha un metodo close() leggermente modificato che grosso modo simile

public void close() throws SQLException {
    if (this.connection is still active) {
        do not close this.connection, but just return it to pool for reuse;
    } else {
        actually invoke this.connection.close();
    }
}

Con altre parole, chiudendoli FreeS la connessione in pool in modo che possa essere rimesso in piscina per il riutilizzo futuro. Se si acquista le connessioni senza chiuderli, poi la piscina sarà a corto di connessioni prima o poi.

Dal momento che questo è urgente e per la produzione vi suggerisco di avere un'occhiata a un pool di connessione decente come c3p0 . E 'più robusto ed affidabile e in grado di gestire i timeout migliore.

Con la configurazione, esso non dovrebbe creare un'altra connessione se è inattivo. Tenta di aggiungere

  minIdle="3"

Con questa impostazione, DBCP manterrà 3 connessioni di tutti i tempi.

Vediamo esattamente lo stesso comportamento con uno dei server poco frequentate. A causa del timeout di connessione predefinito di 8 ore, non vediamo le connessioni quando arriviamo la mattina. Questo è quello che ci aspettavamo. Tuttavia, a volte vediamo collegamento stantio e la prima richiesta avrà esito negativo. Per ovviare a questo problema, è necessario aggiungere seguenti attributi,

testWhileIdle="true",
timeBetweenEvictionRunsMillis="60000"
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top