0

スクリプトを実行してから一定時間が経過すると、Ruby で「mysql has gone away」エラーが発生します。

接続が失われたときに自動再接続するように mysql gem に指示したいと思います。

私の現在のコードは次のようになります。

def self.connect()
  begin
    if !@@dbh.nil?
      self.disconnect
    end
    @@dbh = Mysql.real_connect(@@server, @@user, @@pass, @@db)
    puts "[+] Connected to the " + @@db + " database with user '" + @@user + "'"
  rescue Mysql::Error => e
    # log error
  end
end

次のガイド [0] では、mysql gem には「reconnect」オブジェクト変数があると書かれていますが、コード内でそれを使用する方法がわかりません。

このオプションを上記のコードに実装するにはどうすればよいですか?

前もって感謝します、ライアン

[0] http://www.tmtm.org/en/mysql/ruby/

編集 - -

わかった。私はそれを理解したと思います。

@@dbh.reconnect = true行の後に追加する必要があり@@dbh = Mysql.real_connect(@@server, @@user, @@pass, @@db)ます。

注: IRC の 'nice' chapy によると、mysql gem は使用するのに最適な Ruby gem ではない可能性があります。

4

1 に答える 1

1

新しいプロジェクトを開始する場合は、mysql2 gem が最適です。旧バージョンからの大幅な改善です。

例をRuby化する試みは次のとおりです。

def connect
  begin
    if (@dbh)
      self.disconnect
    end

    @dbh = Mysql.real_connect(@server, @user, @pass, @db)
    puts "[+] Connected to the #{@db} database with user '#{@user}'"
  rescue Mysql::Error => e
    # log error
  end
end

@従来の変数を使用する理由はattr_accessor、インターフェイスを適切に設計すれば使用できるからです。

シングルトン クラスを使いこなすよりも、シングルトン インスタンスを使用する方が適切です。例えば:

class MyApp
  def self.db
    @db ||= Database.new
  end

  class Database
    # Instance methods like initialize, connect, disconnect, etc.
  end
 end

これは次のように使用できます。

MyApp.db.connect

クラスの代わりにクラスのインスタンスを直接使用する利点は、一度に複数の接続をサポートできることです。

于 2012-07-17T17:55:03.507 に答える