Тайм-аут соединения с MySQL - сервер MySQL пропал (Синатра, ActiveRecord) - PullRequest
4 голосов
/ 01 ноября 2009

Вот схема моего приложения:

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..

и т.д.

Я звоню create_connection только один раз - во время инициализации приложения. Я столкнулся с 8-часовым пределом простоя MySQL ( Сервер MySQL пропал ), и мне интересно, как лучше к нему подойти.

Я просмотрел источник ActiveRecord и обнаружил, что он объединяет соединения с сервером БД. Итак, в идеале я должен создать новое соединение внутри каждого веб-запроса или увеличить время ожидания?

Спасибо за ваше время!

Ответы [ 4 ]

1 голос
/ 19 января 2010

Спасибо за все ответы. 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
1 голос
/ 19 января 2010

Возможно, вы столкнулись с той же проблемой, что и этот другой вопрос SO: "Сервер MySQL ушел" с Ruby on Rails

1 голос
/ 19 января 2010

У меня была похожая проблема, неожиданно начавшаяся (в некотором коде C ++), когда был обновлен mySQL.

Это произошло потому, что для автоматического переподключения по умолчанию установлено значение 0 в версии 5.0.3 (http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html).

Мне пришлось установить MYSQL_OPT_RECONNECT на «1» в коде.

Примечание: он должен вызываться после любых вызовов mySQL init () и перед установлением фактического соединения.

1 голос
/ 01 ноября 2009

Вы можете увеличить переменную wait_timeout для mysqld. Это может быть установлено в конфигурационном файле или передано аргументами командной строки.

Вы используете постоянные соединения?

Еще одна вещь, которую нужно попробовать, это установить клиент mysql MYSQL_OPT_RECONNECT

...