Тайм-аут соединения MySQL - сервер MySQL исчез (Sinatra, ActiveRecord)
-
11-09-2019 - |
Вопрос
Вот схема моего приложения:
require 'sinatra'
require 'active_record'
ActiveRecord::Base.establish_connection(
:adapter => "mysql", host => $DB_HOSTNAME,
:database => $DB_NAME,:username => $DB_USERNAME,:password => $DB_PASSWORD)
class Sometable < ActiveRecord::Base
end
get '/' do
#stuff with Sometable
end
# a lot of route handlers..
и т. д.
Я звоню установить_соединение только один раз — во время инициализации приложения.Я столкнулся с 8-часовым лимитом простоя MySQL (Сервер MySQL ушел) и мне интересно, как лучше всего к этому подойти.
Я просмотрел источник ActiveRecord и обнаружил, что он объединяет соединения с сервером БД.Итак, следует ли мне в идеале создавать новое соединение внутри каждого веб-запроса или увеличивать настройку тайм-аута?
Спасибо за ваше время!
Решение 4
Спасибо за ответы на все вопросы.MYSQL_OPT_RECONNECT кажется хорошим решением.Но я не уверен, как это сделать с помощью ActiveRecord.
На данный момент я решил это, используя:
#prevent MySQL server has gone away by verifying connections every 30 minutes.
Thread.new {
loop {
sleep(60*30);
ActiveRecord::Base.verify_active_connections!
}
}.priority = -10
Другие советы
Вы могли бы увеличить wait_timeout переменная для mysqld.Его можно установить в файле конфигурации или передать с помощью аргументов командной строки.
Используете ли вы постоянные соединения?
Еще одна вещь, которую стоит попробовать, — установить для клиента MySQL MYSQL_OPT_RECONNECT.
Вероятно, вы столкнулись с той же проблемой, которая описана в другом вопросе SO: «Сервер MySQL исчез» с Ruby on Rails
У меня внезапно возникла аналогичная проблема (в каком-то коде C++), когда MySQL был обновлен.
Это произошло потому, что в версии 5.0.3 для автоматического повторного подключения по умолчанию установлено значение 0 (http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html).
Мне пришлось установить в коде MYSQL_OPT_RECONNECT на «1».
Примечание:его следует вызывать после любых вызовов mySQL init() и перед фактическим соединением.