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 连接异常的主要内容,如果未能解决你的问题,请参考以下文章
在MySQL,Grails 2应用程序更长时间不活动期间保持池连接活动(或将它们计时并获得新的连接)的正确方法