一尘不染

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

tomcat

我在VPS的Ubuntu中的Tomcat上运行了一个小grails应用程序。我使用MySql作为数据存储,除非我离开应用程序超过半天(8小时?),否则一切正常。我做了一些搜索,显然这是wait_timeoutmysql.cnf中的默认设置,因此8小时后连接将终止,但是Tomcat不知道,因此当下一个用户尝试查看站点时,他们将看到连接失败错误。刷新页面将解决此问题,但我想完全摆脱该错误。对于我的MySql版本(5.0.75),我只有my.cnf,它不包含这样的参数,无论如何更改此参数都不能解决问题。

博客文章似乎报告了类似的错误,但是我仍然不完全了解我需要配置什么才能解决此问题,并且我希望有比另一个第三方库更简单的解决方案。我正在运行的计算机具有256MB内存,并且我试图将运行的程序/服务的数量保持在最低水平。

我可以在Grails / Tomcat / MySql中进行配置以使它消失吗?

提前致谢,

加夫

从我的Catalina.out;

2010-04-29 21:26:25,946 [http-8080-2] ERROR util.JDBCExceptionReporter  - The last packet successfully received from the server was 102,906,722 milliseconds$
2010-04-29 21:26:25,994 [http-8080-2] ERROR errors.GrailsExceptionResolver  - Broken pipe
java.net.SocketException: Broken pipe
        at java.net.SocketOutputStream.socketWrite0(Native Method)
         ...
2010-04-29 21:26:26,016 [http-8080-2] ERROR util.JDBCExceptionReporter  - Already closed.
2010-04-29 21:26:26,016 [http-8080-2] ERROR util.JDBCExceptionReporter  - Already closed.
2010-04-29 21:26:26,017 [http-8080-2] ERROR servlet.GrailsDispatcherServlet  - HandlerInterceptor.afterCompletion threw exception
org.hibernate.exception.GenericJDBCException: Cannot release connection
        at java.lang.Thread.run(Thread.java:619)
Caused by: java.sql.SQLException: Already closed.
        at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:84)
        at org.apache.commons.dbcp.PoolingDataSource$PoolGuardConnectionWrapper.close(PoolingDataSource.java:181)
        ... 1 more

阅读 254

收藏
2020-06-16

共1个答案

一尘不染

参考本文,您的DBCP连接池中有陈旧的连接,这些连接被操作系统或防火墙静默删除。

解决方案是定义一个验证查询并在实际在应用程序中使用连接之前对连接进行完整性检查。在grails中,这实际上是通过修改 grails-app / conf
/ spring / Resource.groovy
文件并添加以下内容来完成的:

beans = {
  dataSource(BasicDataSource) {
    //run the evictor every 30 minutes and evict any connections older than 30 minutes.
    minEvictableIdleTimeMillis=1800000
    timeBetweenEvictionRunsMillis=1800000
    numTestsPerEvictionRun=3
    //test the connection while its idle, before borrow and return it
    testOnBorrow=true
    testWhileIdle=true
    testOnReturn=true
    validationQuery="SELECT 1"
  }
}
2020-06-16