【问题标题】:MySQL connection timeout - MySQL server has gone away (Sinatra, ActiveRecord)MySQL 连接超时 - MySQL 服务器已消失(Sinatra、ActiveRecord)
【发布时间】:2010-12-12 01:30:39
【问题描述】:

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

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 (MySQL server has gone away) 的 8 小时空闲连接限制,我想知道最好的方法。

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

感谢您的宝贵时间!

【问题讨论】:

    标签: mysql ruby activerecord sinatra connection-timeout


    【解决方案1】:

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

    您是否使用持久连接?

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

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

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

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

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

        【讨论】:

          【解决方案4】:

          感谢您的所有回答。 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
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-05-17
            • 2011-10-15
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-12-14
            • 2012-05-25
            • 2011-06-07
            相关资源
            最近更新 更多