При каких обстоятельствах вы бы хотели, чтобы Rails не устанавливал соединение с MYSQL

Я столкнулся с несколькими ошибками в приложении rails, например:

ActiveRecord::StatementInvalid: Mysql::Error: Lost connection to MySQL server during query: SELECT * FROM `actions` WHERE (`foo`.`id` = 16)

Похоже, что происходит то, что mysql-соединение закрывается после истечения времени ожидания, и rails не замечает, пока не станет слишком поздно.

Средство , которое я нашел , похоже, , чтобы установить для флага переподключения значение true в базе данных. yaml, или для любого действия базы данных, добавив некоторый код, например, так:

def some_database_operation
  begin
    Account.find(1)
    # or some other database operations here...
  rescue ActiveRecord::StatementInvalid
    ActiveRecord::Base.connection.reconnect!
    unless @already_retried
      @already_retried = true
      retry 
    end
    raise
  else
    @already_retried = false
  end
end
end

Я перечисляю эту опцию над этой видимой здесь , потому что эта опция, очевидно, небезопасна для транзакций:

ActiveRecord::ConnectionAdapters::MysqlAdapter.module_eval do
  def execute_with_retry_once(sql, name = nil)
    retried = false
    begin
      execute_without_retry_once(sql, name)
    rescue ActiveRecord::StatementInvalid => exception
      ActiveRecord::Base.logger.info "#{exception}, retried? #{retried}"

      # Our database connection has gone away, reconnect and retry this method
      reconnect!
      unless retried
        retried = true
        retry
      end
    end
  end

  alias_method_chain :execute, :retry_once
end

Из опций, позволяющих избежать этой надоедливой ошибки, опция переподключения в файле yaml кажется самой опрятной, но мне любопытно; почему бы вам не установить это значение по умолчанию в вашей базе данных?

Я бы предпочел не решать одну проблему, вызывая нагрузку других в дальнейшем.

Спасибо,

вопрос задан 8.10.2009
Chris Adams
1032 репутация

2 ответов