MySQL连接在Jetty上的JRuby on Rails应用程序下超时/被放弃

时间:2009-10-02 09:21:43

标签: ruby-on-rails jdbc jetty jruby

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

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

堆栈跟踪:

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

**开始没有异常**

java.io.EOFException的

堆栈跟踪:

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

从阅读中我的理解是,由于不活动,MySQL会在一段时间内终止我们的连接池(这是有意义的,因为现在暂停处于非常轻的负载下)。它在JRuby 1.3.1下运行,包含以下宝石:

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

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

谢谢, 史蒂夫

2 个答案:

答案 0 :(得分:1)

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

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

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

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

答案 1 :(得分:1)

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

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