我在脚本运行了一段时间后遇到了“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宝石。
答案 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
直接使用类的实例而不是类的优点是,您可以一次支持多个连接。