mysqlplus gem が一般的なRuby mysql gemよりも優れたデータベース ドライバーであるかどうかを知りたいですか? 私の Rails アプリケーションでは、次のような問題が発生していました: ActiveRecord::StatementInvalid: Mysql::Error: MySQL server has gone away
3 に答える
MySQL server has gone away
mysqlサーバーがクエリの実行中にクラッシュしたか、(より一般的には)max_allowed_packetより大きいケルトを送信したことを意味します。http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.htmlを参照してください
「mysql server has gone away」エラーのみをチェックしたい場合は、activerecord で十分です。これは成熟したコードベースであり、ほとんどのユースケースに十分対応できます。
詳細については、 http://blog.new-bamboo.co.uk/2010/4/11/automatic-reconnection-of-mysql-connections-in-active-recordをチェックしてください。
同時実行性が必要な場合は mysqlplus の方が優れています。すべてのクールな男の子が推奨しています :-) しかし、それが本番環境に対応しているかどうかはわかりません。
mysql は、一定期間非アクティブになった後、接続を取得します。これは「wait_timeout」で定義されています。
mysql でこれを見ることができます:
mysql> show variables like 'wait_timeout'
デフォルトでは 8 時間です。接続を確立しており、この期間にこの接続を介して実行されたクエリがないため、このエラーが発生しています。
Activerecord には ActiveRecord::Base#verify_active_connections があります! このユースケースのために。database.yml で reconnect: true を指定すると、これが自動的に行われます。
上記のメソッドは、接続プールから接続をチェックアウトするときに実行され、非アクティブから保護します。
実行時間の長いクエリを実行していて、wait_timeoutの期間を超えている場合は役に立ちません。その場合、mysql でタイムアウト変数を増やす必要がある場合があります。http://gist.github.com/238999でパッチを設定することもでき ます。これにより、このようなエラーでクエリが再試行されます。状況が変わった可能性がありますが、再試行回数がないため、パッチは堅牢ではありません。