【问题标题】:Ruby mysql gem 'reconnect' object variableRuby mysql gem“重新连接”对象变量
【发布时间】:2012-07-16 05:47:37
【问题描述】:

在脚本运行一段时间后,我在 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 = Mysql.real_connect(@@server, @@user, @@pass, @@db) 行之后添加@@dbh.reconnect = true

注意:根据 IRC 上的 'nice' chapy,mysql gem 可能不是最好的 Ruby gem。

【问题讨论】:

  • 您如此依赖@@ 类变量有什么特别的原因吗?这是非常规的,以至于 Stack Overflow 语法高亮器甚至都不知道如何使用它们。
  • 我不确定原因是什么。数据库类是由其他人编写的。我看看能不能改感谢您的建议!

标签: mysql ruby reconnect


【解决方案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

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

【讨论】:

  • 太棒了!谢谢你的建议!
  • P.S. mysql2 gem 看起来好多了,我会调查一下它会实现多少工作。再次感谢!
猜你喜欢
  • 1970-01-01
  • 2016-09-26
  • 2021-08-16
  • 2023-03-23
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-27
相关资源
最近更新 更多