2009-11-01 3 views
4

Вот набросок моего приложения:MySQL таймаут соединения - MySQL сервер ушел (Sinatra, ActiveRecord)

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

т.д.

Я называю establish_connection только один раз - во время инициализации приложения , Я столкнулся с 8-часовым лимитом подключения к MySQL (MySQL server has gone away), и мне интересно, какой подход к нему подходит.

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

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

ответ

1

Спасибо за все ответы. 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

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

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

Еще одна вещь, чтобы попытаться это иметь MySQL клиент установил MYSQL_OPT_RECONNECT

1

у меня была аналогичная проблема, вдруг начинают (в некотором коде C++), когда mySQL был обновлен.

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

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

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