2009-07-20 10 views
9

Ho una macchina che esegue un'app java che parla con un'istanza mysql in esecuzione sulla stessa istanza. l'app utilizza i driver jdbc4 di mysql. Continuo a ricevere com.mysql.jdbc.exceptions.jdbc4.CommunicationsException a volte casuali.jdbc4 CommunicationsException

Ecco l'intero messaggio.

Impossibile aprire la connessione JDBC per la transazione; eccezione annidata è

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was25899 milliseconds ago.The last packet sent successfully to the server was 25899 milliseconds ago, which is longer than the server configured value of 'wait_timeout'. You should consider either expiring and/or testing connection validity before use in your application, increasing the server configured values for client timeouts, or using the Connector/J connection property 'autoReconnect=true' to avoid this problem. 

Per mysql, il valore di 'wait_timeout' globale e 'interactive_timeout' è impostato a 3600 secondi e 'connect_timeout' è impostato a 60 secondi. il valore di timeout di attesa è molto più alto dei 26 secondi (25899 msec). menzionato nella traccia dell'eccezione.

Uso dbcp per il pool di connessioni ed ecco la configurazione del bean di primavera per l'origine dati.

<bean id="dataSource" destroy-method="close" class="org.apache.commons.dbcp.BasicDataSource" > 
      <property name="driverClassName" value="com.mysql.jdbc.Driver"/> 
        <property name="url" value="jdbc:mysql://localhost:3306/db"/> 
       <property name="username" value="xxx"/> 
       <property name="password" value="xxx" /> 
        <property name="poolPreparedStatements" value="false" /> 
      <property name="maxActive" value="3" /> 
      <property name="maxIdle" value="3" /> 
    </bean> 

Qualche idea sul perché questo potrebbe accadere? L'utilizzo di c3p0 risolverà il problema?

risposta

6

Provare a configurare correttamente il DBCP di Apache Commons.

è necessario impostare:

  • validationQuery per selezionare 1 + 1
  • testOnBorrow true

Questo dovrebbe risolvere il problema.

+0

Thnx, questo sembra funzionare al momento. – letronje

0

Seguirò il consiglio nell'eccezione. Si dovrebbe prendere in considerazione sia:

  1. scadenza e/o prove la validità di connessione prima dell'uso nella vostra applicazione,
  2. aumentando i valori di server configurati per timeout client, o
  3. utilizzando il/J proprietà di connessione connettore 'Autoreconnect = vero 'per evitare questo problema. Prova ad aggiungerlo al tuo URL di connessione (consulta i documenti per la sintassi esatta) e vedi se è d'aiuto.

Dubito che C3P0 sarà molto meglio del DBCP che stai già utilizzando. L'eccezione ti sta dando alcuni consigli specifici. Hai provato # 3. E gli altri due?

So come chiedere a WebLogic di verificare le connessioni prima di utilizzarle. Dovresti scoprire come fare lo stesso con Tomcat.

+0

provato, ora ottenendo "Impossibile aprire la connessione JDBC per la transazione; l'eccezione nidificata è com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Errore del collegamento di comunicazione " – letronje

1

Puoi descrivere in che modo la tua app gestisce il pool di connessioni? Dubito che autoReconnect = true nel driver JDBC ricolleghi le connessioni dalla tua app. L'app deve riconnettersi quando perde una connessione.

0

Ho visto prima che le macchine Windows che sono state spostate sulla rete hanno avuto problemi con la connessione a se stessi.

Esiste qualche problema di connettività al di fuori della JVM, ad esempio il client mysql che si collega al server e il timeout, ecc.?

Problemi correlati