SORM vs MySQL 空闲连接

Posted

技术标签:

【中文标题】SORM vs MySQL 空闲连接【英文标题】:SORM vs MySQL idle connection 【发布时间】:2014-01-16 07:04:14 【问题描述】:

我正在使用 Play Framework 2.2.1MySQL 5.5sorm 0.3.10

由于 mysql 在指定的空闲超时后断开非活动连接,我的应用程序中出现了这个异常:

[CommunicationsException: Communications link failure The last packet successfully received from the server was 162 701 milliseconds ago. The last packet sent successfully to the server was 0 milliseconds ago.]

据我了解,sorm 使用的是 c3p0 连接池。是否可以以某种方式配置 c3p0 或 sorm 以指定延迟踢 mysql 或在连接断开后自动重新连接?

【问题讨论】:

【参考方案1】:

SORM 的0.3.13-SNAPSHOTInstance 引入了timeout 参数,默认设置为30。此设置确定允许底层连接空闲的秒数。当达到超时时,一种“keepalive”请求被发送到数据库并重置计时器。当进行任何正常查询时,计时器也会重置。该实现仅依赖于 C3P0 的idleConnectionTestPeriod

如需进一步讨论、建议和报告,请访问the associated ticket on the issue tracker 或打开另一个。如果the associated ticket 中没有任何投诉,此更改将使其进入 0.3.13 版本。

【讨论】:

【参考方案2】:

用 c3p0 很容易解决这个问题,但我会仔细检查你是否在使用它。 BoneCP 是默认的 play2 连接池。用 BoneCP 也很容易解决这个问题!

在 c3p0 中,配置参数 maxIdleTime、maxConnectionAge 或(更好)连接测试机制会有所帮助。见http://www.mchange.com/projects/c3p0/#configuring_connection_testing

如果你想在 play2 中使用 c3p0,请参阅https://github.com/swaldman/c3p0-play

【讨论】:

嗯,sorm 依赖于 c3p0,如果它会与 play 插件冲突,我不会感到惊讶。 如果您想查看 c3p0 是否真的是您的应用程序使用的池,请在日志文件中查找池初始化时池配置的转储(或者让您的 VM 转储线程,并查找c3p0 相关的线程,或者使用 JMX 查看是否有任何 c3p0 池在使用中)。 Sorm 内部使用 c3p0。 那么有可能以某种方式进行配置吗? @SergeyLiar 我已经在问题跟踪器上打开了related ticket,其中包含有关可能解决方法的信息。我们应该在那里继续讨论。

以上是关于SORM vs MySQL 空闲连接的主要内容,如果未能解决你的问题,请参考以下文章

MySql连接空闲8小时自动断开的原因及连接池配置方法

终止空闲的mysql连接

Go-sql-driver:关闭坏空闲连接:对等点重置连接(mysql)

mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案

java jdbc mysql连接器:长时间空闲后如何解决断开连接

mysql连接的空闲时间超过8小时后 MySQL自动断开该连接解决方案