0

「mysql2」を必要とし、mysqlのようにクエリステートメントを使用するrubyスクリプトがあります
@db.query("SELECT sname,id FROM streets where region_id=#{region["id"]}")
が、常に次のようなエラーが報告されます。

main.rb:261:in `query': MySQL server has gone away (Mysql2::Error)
    from main.rb:261:in `block (3 levels) in <main>'
    from main.rb:258:in `each'
    from main.rb:258:in `block (2 levels) in <main>'
    from main.rb:254:in `each'
    from main.rb:254:in `block in <main>'
    from main.rb:253:in `loop'
    from main.rb:253:in `<main>'

Ubuntu のスクリプトは問題ありませんが、本番環境は CentOS であり、そこにソース コードから MySQL をインストールしました。Rails アプリの実行は問題なく、'mysql2' も必要ですが、このスクリプトを実行すると失敗します。

問題は my.cnf に関連していると思いますが、設定方法がわかりません。

4

2 に答える 2

2

mysql2 gem は、接続が切断された場合に MySQL に再接続するオプションを提供します。my.cnf ファイルを更新するのではなく、gem の database.yml ファイルを更新して、

  reconnect: true

オプション。これにより、必要に応じて mysql2 gem が MySQL への再接続を試みるようになります。

于 2012-12-19T09:32:38.577 に答える
1

オブジェクト @db で直接 .query メソッドを呼び出します...このオブジェクトは正確には何ですか?

つまり... Rails を使用している場合は、次のようなクエリを呼び出す必要があります。

result = ActiveRecord::Base.connection.execute("sql here")

Railsが接続プールを管理しているため、それが原因である可能性があると思います(たとえば、5つの確立された接続と、リクエストに基づいてすべてのクエリがそれらの1つに移動します)。

とにかく、これが原因でない場合は、mysql2 gem がシステム上の異なるバージョンの libmysqlclient.so ライブラリでコンパイルされている可能性があります...その後、クエリを実行しようとすると、互換性のないプロトコルに関するエラーが内部的にスローされますそして切断...

libmysqlclient.so とそのヘッダー ファイルが同じバージョンであることを確認してください...または、それらのバージョンが他にインストールされていない場合は...そして、mysql2 gem を再コンパイルしてみてください。

お役に立てれば。よろしく、 NoICE

于 2011-05-21T06:57:36.080 に答える