1

我们在 Jetty 上运行 JRuby on Rails 应用程序,并且在启动之前到达暂存服务器突然遇到了一个问题,即我们的 JDBC 连接被放弃。这是一个可爱的堆栈跟踪来说明:

发送到服务器的最后一个数据包是 12 毫秒前。

堆栈跟踪:

com.mysql.jdbc.CommunicationsException:由于底层异常导致通信链接失败:

** 开始嵌套异常 **

java.io.EOFException

堆栈跟踪:

java.io.EOFException at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1913) at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2304) at com.mysql.jdbc.MysqlIO.checkErrorPacket( MysqlIO.java:2803)

根据我的理解,MySQL 由于不活动而在一段时间内杀死了我们的连接池(这是有道理的,因为现在登台处于非常轻的负载下)。它在 JRuby 1.3.1 下运行,带有以下 gem:

activerecord-jdbc-adapter (0.9.1) activerecord-jdbcmysql-adapter (0.9.1) jdbc-mysql (5.0.4)

我假设我可能需要以某种方式设置一些 JDBC 配置以确保连接保持活动状态或正确回收,但我需要一些帮助来找出去哪里。谁能提供我的详细信息?

谢谢,史蒂夫

4

2 回答 2

1

可能是由于wait_timeout设置。您可以尝试将其增加到非常大的值,但这假设您对数据库服务器具有管理访问权限。

我从未使用过 JRuby 或 Rails。但是在“常规”Java 中,我解决这个问题的方法是使用自动回收空闲连接的连接池。例如,c3p0有一个maxIdleTime设置来控制它。

编辑:只是为了好玩,我在“activerecord idle connection”上进行了谷歌搜索,我得到了一些点击。这是一个: http ://groups.google.com/group/sinatrarb/browse_thread/thread/54138bfedac59849

ActiveRecord::Base.verify_active_connections!显然,您可以使用一种名为的方法。我对此解决方案不做任何保证:-)。IANARP(我不是 Ruby 程序员)。

于 2009-10-08T20:56:05.380 回答
1

Rails 或我们的 ActiveRecord-JDBC 代码可能应该提供定期连接 ping 或空闲时间拆卸。服务器剔除的连接是任何连接池实现都应该能够处理的标准情况。

我会说在 kenai.com 上使用 ActiveRecord-JDBC 提交错误,但首先在 JRuby ML 上询问是否有其他人为此找到了可靠的解决方案。

于 2009-10-13T15:00:55.797 回答