Объектная переменная Ruby mysql gem 'reconnect'

Я сталкиваюсь с ошибкой «mysql ушел» в Ruby через определенное время, в течение которого скрипт выполнялся.

Я хочу попытаться указать драгоценному камню mysql автоматически переподключаться при потере соединения.

Мой текущий код выглядит следующим образом:

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 имеет объектную переменную 'reconnect', однако я не уверен, как использовать ее в своем коде.

Как реализовать эту опцию в приведенном выше коде?

Заранее спасибо, Райан

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

ИЗМЕНИТЬ ---

В ПОРЯДКЕ. Думаю, я понял это.

Мне нужно добавить @@dbh.reconnect = true после строки @@dbh = Mysql.real_connect(@@server, @@user, @@pass, @@db).

Примечание. Согласно «хорошему» чату в IRC, гем mysql может быть не лучшим гемом Ruby для использования.


person ethicalhack3r    schedule 17.07.2012    source источник
comment
Есть ли какая-то особая причина, по которой вы так сильно полагаетесь на переменные класса @@? Это нетрадиционно до такой степени, что подсветка синтаксиса Stack Overflow даже не знает, что с ними делать.   -  person tadman    schedule 17.07.2012
comment
Я не уверен, какова была причина. Класс базы данных был написан кем-то другим. Я посмотрю, смогу ли я изменить это. Спасибо за совет!   -  person ethicalhack3r    schedule 18.07.2012


Ответы (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

Преимущество использования экземпляра класса вместо непосредственного класса заключается в том, что вы можете поддерживать более одного соединения одновременно.

person tadman    schedule 17.07.2012
comment
Потрясающий! Спасибо за совет! - person ethicalhack3r; 18.07.2012
comment
P.S. драгоценный камень mysql2 выглядит намного лучше, я посмотрю, сколько работы потребуется для его реализации. Еще раз спасибо! - person ethicalhack3r; 18.07.2012