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 有一个“重新连接”对象变量,但是,我不确定如何在我的代码中使用它。

如何在上面的代码中实现这个选项?

在此先感谢,瑞安

[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 回答