1

我的应用程序(在 Tomcat 服务器上运行)使用 atomikos 连接池与 mysql 数据库连接。一切正常,除了如果让应用程序服务器几个小时不使用连接将被关闭。以下是发生这种情况后再次操作应用服务器时收到的错误消息:

: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

我确实在我的 jndi 参数中将 autoReconnect 设置为 true,但看起来它不起作用。

<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" />

我也在mysql端设置了日志,发现测试查询(select 1)实际上没有发送到mysql,因为连接被关闭了。现在,当问题发生时,我必须每天早上重新启动应用程序服务器。

有什么想法吗?

谢谢

4

1 回答 1

1

最后我发现使用的是Tomcat连接池而不是Atomikos连接池。所以在JNDI配置中应该使用Tomcat连接池参数。它应该是这样的:

<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

于 2013-08-20T11:55:57.173 回答