2013-08-15 10 views
0

мое приложение (работает на сервере Tomcat) использует пул соединений atomikos для подключения к базе данных mysql. все работает отлично, за исключением того, что соединение будет отключено, если сервер приложений не будет использоваться в течение нескольких часов. ниже сообщение об ошибке, когда я работать сервер приложений снова после того, как это происходит:отключений соединений atomikos и autoReconnect не работает

:58:28 AM RusticiSoftware.ScormContentPlayer.Util.Logger LogInfo 
INFO: Parsing metadata 
Aug 15, 2013 9:58:28 AM RusticiSoftware.ScormContentPlayer.DataHelp.JdbcDataHelper ExecuteReturnDbRows 
INFO: ExecuteReturnDbRows: failed - The last packet successfully received from the server was 59,735,409  milliseconds ago. The last packet sent successfully to the server was 59,735,409 milliseconds ago. 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. 

com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 59,735,409 milliseconds ago. The last packet sent successfully to the server was 59,735,409 milliseconds ago. 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. 
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) 
at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) 
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) 
at java.lang.reflect.Constructor.newInstance(Constructor.java:513) 
at com.mysql.jdbc.Util.handleNewInstance(Util.java:411) 
at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1121) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3871) 
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2484) 
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2664) 
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815) 
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155) 
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1379) 
at RusticiSoftware.ScormContentPlayer.DataHelp.JdbcDataHelper.ExecuteReturnDbRows(JdbcDataHelper.java:453) 
.................................. 
................................. 
................................. 

Caused by: java.net.SocketException: Broken pipe 
at java.net.SocketOutputStream.socketWrite0(Native Method) 
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92) 
at java.net.SocketOutputStream.write(SocketOutputStream.java:136) 
at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:65) 
at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:123) 
at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3852) 
... 57 more 

Я установить autoReconnect к истинным в моих параметрах JNDI, но выглядит он не работает.

<Resource name="jdbc/ScormEngineDB" auth="Container" 
      type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/wgea_scorm?charset=utf8&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      username="username" password="password" maxActive="20" maxIdle="10" pinGlobalTxToPhysicalConnection="true" testQuery="select 1" 
      maxWait="-1" /> 

Я также установил журнал в стороне тузда и выяснить, что тестовый запрос (выберите 1) на самом деле не был отправлен в MySQL, потому что соединение закрыто. теперь я должен перезапустить сервер приложений каждое утро, когда проблема возникает.

любые идеи по этому поводу?

благодаря

ответ

0

Наконец я считаю, что Tomcat пул соединений используется вместо Atomikos пула соединений. Поэтому параметры пула соединений Tomcat следует использовать в конфигурации JNDI. Оно должно быть как:

<Resource name="jdbc/ScormEngineDB" auth="Container" 
      type="javax.sql.DataSource" driverClassName="com.mysql.jdbc.Driver" 
      url="jdbc:mysql://localhost:3306/wgea_scorm?charset=utf8&amp;useUnicode=true&amp;characterEncoding=utf-8&amp;autoReconnect=true" 
      factory="org.apache.tomcat.jdbc.pool.DataSourceFactory" 
      username="username" password="password" maxActive="20" maxIdle="10" autoReconnectForConnectionPools="true" 
autoReconnectForPools="true" pinGlobalTxToPhysicalConnection="true" 
<!-- below are Tomcat connection pool parameters--> 
testOnBorrow="true" logValidationErrors="true" validationQuery="select 1" testWhileIdle="true" 
testOnConnect="true" validationInterval="3000000" maxWait="-1" /> 

параметр validationInterval может быть установлен на значение, которое меньше, чем тайм-аут соединения с базой данных, так что соединение может храниться в живых. С уважением, параметр autoConnection, многие говорят, что он не рекомендуется, поэтому его можно удалить из вышеуказанной конфигурации JNDI. См. http://tomcat.10.x6.nabble.com/connection-autoReconnect-td4340944.html для получения дополнительной информации