Ruby mysql gem'reconnect'对象变量

时间:2012-07-17 10:06:01

标签: mysql ruby reconnect

我在脚本运行了一段时间后遇到了“mysql已经消失”的错误。

我想尝试告诉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上的'漂亮'chapy,mysql gem可能不是最好使用的Ruby宝石。

1 个答案:

答案 0 :(得分:1)

如果您正在开始一个新项目,mysql2宝石就是您的选择。这是对旧版本的巨大改进。

尝试Ruby-ize你的例子是:

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

直接使用类的实例而不是类的优点是,您可以一次支持多个连接。