4

这是我的应用程序的大纲:

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..

等等

我只调用了一次建立连接 - 在应用程序初始化期间。我遇到了 MySQL 的 8 小时空闲连接限制(MySQL 服务器已经消失),我想知道最好的方法。

我浏览了 ActiveRecord 源,发现它汇集了数据库服务器连接。那么,理想情况下,我应该在每个 Web 请求中创建一个新连接还是增加超时设置?

谢谢你的时间!

4

4 回答 4

1

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

你在使用持久连接吗?

要尝试的另一件事是让 mysql 客户端设置 MYSQL_OPT_RECONNECT

于 2009-11-01T16:12:34.770 回答
1

您可能遇到与其他 SO 问题所涵盖的相同问题:“MySQL server has gone away” with Ruby on Rails

于 2010-01-18T21:39:00.127 回答
1

升级 mySQL 时,我突然出现了类似的问题(在某些 C++ 代码中)。

这是因为自动重新连接在版本 5.0.3 ( http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html ) 中默认设置为 0。

我必须在代码中将 MYSQL_OPT_RECONNECT 设置为“1”。

注意:它应该在任何 mySQL init() 调用之后和建立实际连接之前调用。

于 2010-01-18T21:51:44.340 回答
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
于 2010-01-19T14:33:34.413 回答