Grails 和 MySQL 连接异常

Posted

技术标签:

【中文标题】Grails 和 MySQL 连接异常【英文标题】:Grails and MySQL Connection Exception 【发布时间】:2011-11-07 18:57:49 【问题描述】:

我有一个正在生产中的 grails 应用程序。今天早上我收到了服务器没有解析的警报。雄猫不停地旋转。我进行了研究,看起来它与 mysql 有关,导致连接在 8 小时不活动后超时。 I have found examples on *** 有类似问题的人。但是,所有这些人都提到,如果他们再次访问服务器并刷新连接。对我来说,网站完全关闭了,Tomcat 也没有回应。听起来是不是还有别的东西在起作用?

Tomcat 日志中的最后一个异常

2011-Aug-30 23:58:43,283 [TP-Processor19] org.hibernate.util.JDBCExceptionReporter
 ERROR The last packet successfully received from the server was 37,118,147 milliseconds ago.  The last packet sent successfully to the server was 37,122,138 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.
2011-Aug-30 23:58:43,290 [TP-Processor19] org.codehaus.groovy.grails.web.errors.GrailsExceptionResolver
 ERROR Exception occurred when processing request: [GET] /picks/ncaafb
Stacktrace follows:
java.net.SocketException: Connection timed out
        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:3302)
        at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1940)
        at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2113)
        at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2568)
        at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2113)
        at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
  at com.mysql.jdbc.PreparedStatement.executeQuery(PreparedStatement.java:2275)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
        at org.apache.commons.dbcp.DelegatingPreparedStatement.executeQuery(DelegatingPreparedStatement.java:96)
        at sportsdb.Season.getCurrentNCAAFootballSeason(Season.groovy:93)
        at PicksController$_closure2.doCall(PicksController.groovy:60)
        at PicksController$_closure2.doCall(PicksController.groovy)
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896)
        at java.lang.Thread.run(Thread.java:662)
2011-Aug-30 23:58:43,315 [TP-Processor19] org.hibernate.util.JDBCExceptionReporter
 ERROR Already closed.
2011-Aug-30 23:58:43,315 [TP-Processor19] org.hibernate.util.JDBCExceptionReporter
 ERROR Already closed.
2011-Aug-30 23:58:43,316 [TP-Processor19] org.codehaus.groovy.grails.web.servlet.GrailsDispatcherServlet
 ERROR HandlerInterceptor.afterCompletion threw exception
org.hibernate.exception.GenericJDBCException: Cannot release connection
        at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
        at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
        at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:774)
        at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:703)
        at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:896)
        at java.lang.Thread.run(Thread.java:662)
Caused by: java.sql.SQLException: Already closed.
        at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)
        at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:191)
        at $Proxy7.close(Unknown Source)
        ... 6 more

我的计划是实施上面链接中提到的解决方案,但我想确保没有其他明显可疑的事情发生,因为我们的结果有些不同(他们的连接令人耳目一新,而我的则不是)。

【问题讨论】:

我认为这样做***.com/questions/2740987/… 会解决它 【参考方案1】:

如果您在数据源(例如 testOnBorrow)上使用 Tomcat JNDI 数据源 look at some of the parameters you can set。如果验证失败,连接将从池中删除。测试连接会产生一些性能开销,但它应该可以解决这样的问题。如果您将 minIdle/maxIdle 设置为高,则可以解释为什么您在重新连接为其他人修复问题时继续遇到问题。

【讨论】:

我正在使用 MySQL ConnectorJ。此处不能用ConnectorJ设置参数大纲吗?:***.com/questions/2740987/… 我通常使用 JNDI 在 Tomcat 上配置我的数据源,所以这是我更熟悉的。但仔细观察刚才的Grails doc,当您在DataSource.groovy(或单独在resources.groovy)中定义它时,您也可以使用相同的DBCP BasicDataSource 属性。

以上是关于Grails 和 MySQL 连接异常的主要内容,如果未能解决你的问题,请参考以下文章

Grails 2.3.0 和 mysql 连接超时

在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法

Grails 应用程序中的 MySql 损坏管道异常

MySQL 连接超时问题 - 使用 Hibernate 和 ORM 的 Tomcat 上的 Grails 应用程序

Grails 数据源异常

grails怎样连接mysql数据库