2009-10-02 47 views
1

我们在Jetty上运行JRuby on Rails应用程序,并且在启动之前到达登台服务器突然出现了我们的JDBC连接被放弃的问题。这里有一个可爱的stacktrace来说明:在Jetty上的JRuby on Rails应用程序中超时/被丢弃MySQL连接

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

堆栈跟踪:

com.mysql.jdbc.CommunicationsException:通信链路故障,由于底层异常:

** BEGIN嵌套异常**

java.io.EOFException的

STACKTRACE:

java.io.EOFException at 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适配器(0.9.1) 的ActiveRecord-jdbcmysql适配器(0.9.1) jdbcmysql(5.0.4)

我假设我可能需要以某种方式设置一些JDBC配置,以确保连接保持活动状态或正确回收,但我需要一些帮助来找出在哪里寻找。任何人都可以提供我的细节?

谢谢你,史蒂夫

回答

1

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

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

编辑:只是为了好玩,我在Google上搜索了“activerecord闲置连接”,并且我点了几次。这里有一个:http://groups.google.com/group/sinatrarb/browse_thread/thread/54138bfedac59849

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

1

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

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

相关问题