11

Railsアプリケーションは内部でのみ実行されるようになったので、今のところ訪問はそれほど多くありません。また、Webからデータをフェッチしてmysqlデータベースに挿入するために、ほとんど実行されていない2つのresqueワーカーがあり、挿入するたびに10秒間スリープします。

VPSで実行します。5時間ごとのように、例外が発生しますException occured: [Mysql2::Error] closed MySQL connection"

例外の原因は何でしょうか?現在、プールサイズは5です。

プールのサイズを大きくして、で指定すると役に立ちますreconnect: truedatabase.yml

4

3 に答える 3

12

これは、mysql2gemバージョン0.2.11以下をマルチスレッドと組み合わせて使用​​する場合の一般的な問題です。問題の詳細を含む課題追跡システムにバグがありますが、結論として、アドバイスは次のとおりです。

  1. 使用しているgemバージョンを更新して>= 0.2.12
  2. ファイルreconnect: trueにデータベース接続構成のオプションを追加しますdatabase.yml

あなたはおそらくすでにあなたの問題を解決しましたが、これはこの質問に出くわす他の人を助けるかもしれません。

于 2013-11-04T17:18:01.123 に答える
1

ワーカーが長期間非アクティブになっていると、MySQL接続が失われます。

解決策についてはこちらをご覧ください

または、これをイニシャライザに貼り付けます

unless Rails.env.to_s == 'test'
  module ActiveRecord::ConnectionAdapters
    class Mysql2Adapter
      alias_method :execute_without_retry, :execute

    def execute(*args)
      execute_without_retry(*args)
      rescue Exception => e
        if e.message =~ /server has gone away/i
          warn "Server timed out, retrying"
          reconnect!
          retry
        else
          raise e
        end
      end
    end
  end
end 
于 2012-08-02T10:48:29.190 に答える
0

delayd_jobに対してこれをデバッグする方法に関する詳細情報。を設定reconnect: trueした後、次のことを行いましたdatabase.ymlが、このソリューションは機能しません。

cd /your_rails_deploy_code/log
cat production.log

# check the pids from delayed job:
E, [2017-02-01T19:45:21.614579 #2592] ERROR -- : 2017-02-01T19:45:21+0000: [Worker(delayed_job.3 host:demeter pid:2592)] Job ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper (id=193675) FAILED (0 prior attempts) with Mysql2::Error: closed MySQL connection

私の特定のケースでpid:2592は、常に失敗しているのはそれだけです。なんで?確認してみましょう:

[deploy@demeter] ps -ef | grep 2592
deploy   2592     1  0 Jan31 ?        00:00:40 production/delayed_job.3
deploy   23312     1  0 Feb01 ?        00:00:40 production/delayed_job.1
deploy   23318     1  0 Feb01 ?        00:00:40 production/delayed_job.0

最新のデプロイの数日前に特定のプロセスが開始されたことに気づきました。私がそれを殺すとすぐに、エラーはなくなりました。私の特定のケースで起こったと思うのは、最新のデプロイですべてのdelayed_jobインスタンスが正しく削除されなかったということです。

于 2017-02-01T20:47:23.107 に答える