2009-05-05 5 views
4

Ich verwende MYSQL 5.0 und Tomcat 5.5. Nach 8 Stunden, MYSQL schließt standardmäßig alle inaktiven Verbindungen und so bekomme ich eine SQL-Ausnahme. Eine Lösung für dieses ProblemMYSQL 8 Stunden Timeout Problem

Antwort

5

Welchen Verbindungspool verwenden Sie? Die meisten erlauben es, dass ein Heartbeat-Befehl periodisch ausgeführt wird, um zu verhindern, dass Verbindungen auslaufen.

EDIT: Blick auf die DBCP configuration page, ich denke, Sie sollten eine geeignete (billig) validationQuery setzen. Sie könnten dann entweder DBCP befehlen, dies zu testen, wenn Sie inaktive Verbindungen (testWhileIdle) potentiell entfernen oder es kurz vor dem Zurückgeben der Verbindung (testOnBorrow) testen lassen. Das erste würde (hoffentlich!) Deine untätigen Verbindungen am Leben erhalten; die zweite würde nicht, aber würde Sie gebrochene Verbindungen nicht zurückgeben (d. h. wenn Sie eine neue schaffen würden, falls notwendig).

+0

Oder um die Verbindung vor der Verwendung zu testen, und wenn es getötet wurde, erstellen Sie eine neue Verbindung. – Kieron

+0

Grundsätzlich verwende ich OpenCMS, ein Content Management System, das MYSQL und Tomcat verwendet. Es verwendet DBCP Verbindung Pooling-Mechanismus –

+0

Brilliant Antwort @Jon. Aus welchem ​​Interesse würden Sie diese beiden Methoden empfehlen? –

2

Meinen Sie, dass Sie die Verbindungen aufrechterhalten, während sie im Leerlauf sind? Ich bin kein Experte für mySql, aber in den Datenbanken, mit denen ich gearbeitet habe, gilt es als gute Methode, die Verbindung nur dann offen zu halten, wenn sie benötigt wird, und sie dann zu schließen.

1

Ich weiß nicht, wie das Timeout zu erhöhen, aber ich denke, es sollte eine Einstellung sein .. Warum erstellen Sie die Verbindung nicht, wenn Sie es brauchen, und schließen Sie es nach der Verwendung anders als abhängig von einer erstellten Verbindung ?

+0

wait_timeout, wird die Zeit erhöhen, aber Ich denke nicht, es wäre die machbare Lösung. –

1

Mit MySQL wird standardmäßig eine offene Verbindung (die oft in einem Verbindungspool wartet) nach 8 Stunden Inaktivität geschlossen. Sie können diese Zeit von 8 Stunden ändern, indem die wait_timeout variable Konfiguration entweder in Ihrer my.cnf oder auf unserer mysql Kommandozeile

Siehe auch: http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_wait_timeout http://dev.mysql.com/doc/refman/5.0/ de/gone-away.html

0

Diese Frage wurde vor ein paar Jahren gestellt, aber ich finde, dass es gut ist, die richtige Antwort zu haben. Ich hatte das gleiche Problem, um zu lösen, musste ich mit der Konfiguration ein wenig spielen. Hier ist, was für mich funktioniert. Gehen Sie auf https://people.apache.org/~fhanik/jdbc-pool/jdbc-pool.html für weitere Informationen. Der Code unten kümmerte sich um alles. Es gibt eine Möglichkeit, die Werte zu optimieren, aber ich werde mich später darum kümmern.

<Resource name="jdbc/database" 
       auth="Container" 
       type="javax.sql.DataSource" 
       maxActive="100" 
       maxIdle="30" 
       maxWait="10000" 
      username="username" password="password" 
      driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql:///" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" jdbcInterceptors="org.apache.tomcat.jdbc.pool.interceptor.ConnectionState;org.apache.tomcat.jdbc.pool.interceptor.StatementFinalizer" 
      testWhileIdle="true" 
      testOnBorrow="true" 
      testOnReturn="false" 
      validationQuery="SELECT 1" 
      validationInterval="30000"`enter code here` 
      timeBetweenEvictionRunsMillis="30000" 
      minIdle="10" `enter code here` 
      initialSize="10" 
      removeAbandonedTimeout="60" 
      removeAbandoned="true" 
      logAbandoned="true" 
      minEvictableIdleTimeMillis="30000" 
      jmxEnabled="true"   
      />