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

アプリの初期化中に、establish_connectionを1回だけ呼び出します。MySQLの8時間のアイドル接続制限に遭遇し(MySQLサーバーがなくなりました)、それに対する最善のアプローチを考えています。

ActiveRecordソースを調べたところ、dbサーバー接続がプールされていることがわかりました。したがって、理想的には、すべてのWebリクエスト内に新しい接続を作成するか、タイムアウト設定を増やす必要がありますか?

御時間ありがとうございます!

4

4 に答える 4

1

mysqld のwait_timeout変数を増やすことができます。構成ファイルで設定するか、コマンドライン引数で渡すことができます。

固定接続を使用していますか?

もう 1 つ試すことは、mysql クライアントで MYSQL_OPT_RECONNECT を設定することです。

于 2009-11-01T16:12:34.770 に答える
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

おそらく、この他の SO の質問でカバーされているのと同じ問題に遭遇しているでしょう: Ruby on Rails で「MySQL server has gone away」

于 2010-01-18T21:39:00.127 に答える
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 に答える