保持数据库连接始终处于活动状态的正确方法
Posted
技术标签:
【中文标题】保持数据库连接始终处于活动状态的正确方法【英文标题】:Proper way to keey always alive database connection 【发布时间】:2017-02-13 07:45:21 【问题描述】:我正在使用 Mybatis 查询 mysql DB 的后端 Web 服务器。
网络服务器只在有限的(但不是固定的)时间段内请求,所以几乎每天我都会收到如下警告日志。
pooled.PooledDataSource: Execution of ping query 'SELECT 1' failed: The last packet successfully received from the server was 51,861,027 milliseconds ago. The last packet sent successfully to the server was 51,861,027 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.
autoReconnect=true (Why does autoReconnect=true not seem to work?) 看起来很接近我的问题,但这不是我所期望的。
我想知道当它处于空闲状态一段时间(可能是 1 小时)时,是否可以通过 ping 它来建立连接永不超时。
由于Mybatis使用的是连接池,所以很难强制ping指定的空闲连接并使其永不超时。
我在谷歌上做了一些搜索,但看起来入侵 Mybatis 并不容易。
我的问题是:
-
对于这个问题是否有任何建议、参考或替代库?
或者
-
我是否有理由不尝试保持始终处于活动状态的连接? (潜在风险?违反最佳做法?等)
【问题讨论】:
使用连接池。 【参考方案1】:使用像C3P0
这样的连接池管理器。您将能够配置永久连接。它的工作原理就像您所描述的那样 - 如果连接空闲 N 秒(这是可配置的),则使用示例查询(如 SELEC 1
)“pings”连接以使它们保持活动状态。
这里有一些指导 http://gbif.blogspot.com/2011/08/using-c3p0-with-mybatis.html 或这里 http://edwin.baculsoft.com/2012/09/connecting-mybatis-orm-to-c3p0-connection-pooling/。 C3P0的配置选项可以google到。
【讨论】:
【参考方案2】:定期执行“选择”只是为了保持数据库连接。
【讨论】:
【参考方案3】:连接到 MySQL 服务器时默认的“wait_timeout”为 8 小时(28800 秒),这意味着连接空闲超过 8 小时,Mysql 会自动断开连接。可以使用show variables like '%timeout%';
进行检查
但是 java 连接不知道这个连接从 DB 端被关闭。
要解决此问题,您有多种选择:
-
增加 wait_timeout 属性的值。这适用于所有连接数据库的应用程序,可能不是最佳解决方案
设置interactive_timeout=432000; 设置 wait_timeout=432000;
-
使用像 C3P0 这样的连接池管理器。它会在您间隔一段时间后使用preferredTestQuery ping DB,然后您将拥有永久连接。
【讨论】:
以上是关于保持数据库连接始终处于活动状态的正确方法的主要内容,如果未能解决你的问题,请参考以下文章
iOS 应用程序如何在后台无限期地保持 TCP 连接处于活动状态?
服务器断开连接后如何在 Spring MVC 中保持客户端会话处于活动状态
IIS 回收应用程序池时如何保持 Blazor 服务器连接处于活动状态
保持 X11 应用程序处于活动状态,之后我可以断开连接并重新连接