3

mysqlplus gem が一般的なRuby mysql gemよりも優れたデータベース ドライバーであるかどうかを知りたいですか? 私の Rails アプリケーションでは、次のような問題が発生していました: ActiveRecord::StatementInvalid: Mysql::Error: MySQL server has gone away

4

3 に答える 3

1

MySQL server has gone awaymysqlサーバーがクエリの実行中にクラッシュしたか、(より一般的には)max_allowed_pa​​cketより大きいケルトを送信したことを意味します。http://dev.mysql.com/doc/refman/5.1/en/packet-too-large.htmlを参照してください

于 2009-12-03T19:07:49.763 に答える
1

「mysql server has gone away」エラーのみをチェックしたい場合は、activerecord で十分です。これは成熟したコードベースであり、ほとんどのユースケースに十分対応できます。

詳細については、 http://blog.new-bamboo.co.uk/2010/4/11/automatic-reconnection-of-mysql-connections-in-active-recordをチェックしてください。

同時実行性が必要な場合は mysqlplus の方が優れています。すべてのクールな男の子が推奨しています :-) しかし、それが本番環境に対応しているかどうかはわかりません。

于 2010-05-11T05:44:56.480 に答える
0

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でパッチを設定することもでき ます。これにより、このようなエラーでクエリが再試行されます。状況が変わった可能性がありますが、再試行回数がないため、パッチは堅牢ではありません。

于 2010-05-11T05:40:34.507 に答える