2009-11-01 27 views
4

这里是我的应用程序的轮廓:MySQL连接超时 - MySQL服务器已消失(西纳特拉,ActiveRecord的)

require 'sinatra' 
require 'active_record' 

ActiveRecord::Base.establish_connection(
    :adapter => "mysql", host => $DB_HOSTNAME, 
    :database => $DB_NAME,:username => $DB_USERNAME,:password => $DB_PASSWORD) 

class Sometable < ActiveRecord::Base 
end 

get '/' do 
    #stuff with Sometable 
end 

# a lot of route handlers.. 

我打电话establish_connection只有一次 - 应用程序初始化过程中。我遇到了MySQL的8小时闲置连接限制(MySQL server has gone away),我想知道最好的办法。

我经历了ActiveRecord的来源,发现它汇集了数据库服务器连接。那么,我应该在每个Web请求内创建一个新连接还是增加超时设置?

谢谢你的时间!

回答

1

感谢您的所有答案。 MYSQL_OPT_RECONNECT似乎是一个很好的解决方案。但我不确定如何使用ActiveRecord来做到这一点。

现在,我使用已经解决了它:

#prevent MySQL server has gone away by verifying connections every 30 minutes. 
Thread.new { 
    loop { 
    sleep(60*30); 
    ActiveRecord::Base.verify_active_connections! 
    } 
}.priority = -10 
1

您可以为mysqld增加wait_timeout变量。它可以在配置文件中设置或通过命令行参数传递。

您是否使用持续连接?

另一件事尝试是让MySQL客户端集MYSQL_OPT_RECONNECT

1

我有一个类似的问题突然启动(在某些C++代码中)当mySQL升级时。

这是因为自动重新连接在版本5.0.3(http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html)中默认设置为0。我不得不在代码中将MYSQL_OPT_RECONNECT设置为“1”。

注意:它应该在任何mySQL init()调用之后并在进行实际连接之前调用。