Я испытываю несколько ошибок в приложении rails, например:
ActiveRecord::StatementInvalid: Mysql::Error: Lost connection to MySQL server during query: SELECT * FROM `actions` WHERE (`foo`.`id` = 16)
Похоже, что происходит то, что mysql-соединение закрывается по истечении времени ожидания, а rails не замечает, пока не станет слишком поздно.
Я нашел средств правовой защиты , которые выглядят как , чтобы установить для флага переподключения значение true в database.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 кажется самой опрятной, но мне любопытно; почему в вашей базе данных по умолчанию не установлено значение true?
Я бы предпочел не решать одну проблему, вызывая нагрузку других в дальнейшем.
Спасибо