当前位置: 首页 > 面试题库 >

在长时间不使用MySQL的Grails 2应用中,保持池连接活动(或使其超时并获得新连接)的正确方法

缪坚诚
2023-03-14
问题内容

我有一个grails应用程序,其中包含大量活动,但随后经常不活动,可能会持续几个小时到一整夜。我注意到早上的第一个用户会收到以下类型的异常,我相信这是由于池中的连接过时并且MYSql数据库关闭了它们。

我在Googling中发现了有关使用Connector / J连接属性’autoReconnect =
true’的好主意(以及即使恢复了连接后客户端是否仍然会获得异常)的冲突信息,或者是否设置了冲突信息其他将定期退出或刷新空闲连接,借用测试的属性。Grails在下面使用DBCP。我目前有一个简单的配置,如下所示,我正在寻找一个答案,以期能最好地确保长时间不活动后从池中抢夺的任何连接均有效且未关闭。

dataSource {
        pooled = true
        dbCreate = "update"
        url = "jdbc:mysql://my.ip.address:3306/databasename"
        driverClassName = "com.mysql.jdbc.Driver"
        dialect = org.hibernate.dialect.MySQL5InnoDBDialect
        username = "****"
        password = "****"
        properties {
          //what should I add here?
          }
    }

例外

    2012-06-20 08:40:55,150 [http-bio-8443-exec-1] ERROR transaction.JDBCTransaction  - JDBC begin failed
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: The last packet successfully received from the server was 64,129,968 milliseconds ago.  The last packet sent successfully to the server was 64,129,968 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 com.mysql.jdbc.Util.handleNewInstance(Util.java:411)
    at com.mysql.jdbc.SQLError.createCommunicationsException(SQLError.java:1116)
    at com.mysql.jdbc.MysqlIO.send(MysqlIO.java:3851)
    ...... Lots more .......
Caused by: java.sql.SQLException: Already closed.
    at org.apache.commons.dbcp.PoolableConnection.close(PoolableConnection.java:114)

问题答案:

最简单的方法是配置连接池以指定要在将连接传递给应用程序之前运行以测试该连接的查询:

validationQuery="select 1 as dbcp_connection_test"
testOnBorrow=true

相同的“连接验证”查询可以在其他事件上运行。我不确定这些默认值:

testOnReturn=true
testWhileIdle=true

还有一些配置设置会限制池中空闲连接的“使用期限”,如果在服务器端关闭空闲连接,这将很有用。

minEvictableIdleTimeMillis
timeBetweenEvictionRunsMillis

http://commons.apache.org/dbcp/configuration.html



 类似资料:
  • 所以HTTP。1版本及以上版本支持持久性连接。 现在,我们正在创建一个Rest应用程序,它应该是无状态的。我们一次限制连接的数量。 但如果我仔细阅读HTTP1.0文档,这种方法似乎有问题。 它说服务器将保持连接打开,除非客户端说关闭。 所以,我的问题是如果客户端没有关闭怎么办?如果连接始终处于活动状态,它可能会给我拒绝服务错误。 什么是jetty的默认超时,我如何配置它?我无法找到合适的留档。

  • 我有一个Spring Boot(v2.0.8)应用程序,它使用HikariCP(v2.7.9)池(连接到MariaDB)配置: 问题在于,我们的生产组件每隔几周就会反复抛出 。问题在于它永远不会从中恢复,并且会不断引发异常。因此,需要重新启动计算装置。 从HikariPool源代码来看,这似乎正在发生,因为每次它调用poolEntry都是空的,因此会抛出超时异常。要使其为空,连接池必须没有空闲条目

  • 这简化了代码返回以下错误: 很奇怪,因为服务器已经准备好并设置好了(http://localhost:9200/ 返回了一些json)。

  • 问题内容: 错误代码:2013。查询期间丢失与MySQL服务器的连接 我正在使用MySQL Workbench。另外,我正在运行一批插入件,总共约1000行(例如,相乘1000次),每批插入都花费相当多的时间,其中一些超过600秒。 如何配置工作台,使其在一夜之间继续工作,而又不停止且不丢失连接? 问题答案: 从现在不可用的互联网档案中: 转到“编辑”->“首选项”->“ SQL编辑器”,然后将此

  • 我正试图连接到mysql服务器,但这需要5秒钟。

  • 本文向大家介绍Node.js使用MySQL连接池的方法实例,包括了Node.js使用MySQL连接池的方法实例的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了Node.js使用MySQL连接池的方法。分享给大家供大家参考,具体如下: Nodejs如何使用MySQL Nodejs要连接MySQL,可以使用Nodejs的MysQL驱动来实现。比如,我们这里使用"node-mysql"连接数据库