délai de connexion MySQL - MySQL server has gone away (Sinatra, ActiveRecord)
-
11-09-2019 - |
Question
Voici un aperçu de mon application:
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..
etc.
J'appelle establish_connection juste une fois - lors de l'initialisation de l'application. Je rencontrais la limite de connexion inactive 8 heures de MySQL ( serveur MySQL a disparu ) et me demande la meilleure approche pour lui.
Je suis passé par la source ActiveRecord et a constaté qu'il connexions serveur db pools. Alors, devrais-je créer idéalement une nouvelle connexion à l'intérieur toutes les demandes Web ou d'augmenter le délai d'inactivité?
Merci pour votre temps!
La solution 4
Merci pour toutes les réponses. MYSQL_OPT_RECONNECT semble être une bonne solution. Mais je ne suis pas sûr de savoir comment faire en utilisant ActiveRecord.
Pour l'instant, je l'ai résolu en utilisant:
#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
Autres conseils
Vous pouvez augmenter la variable wait_timeout pour mysqld. Il peut être défini dans le fichier de configuration ou passé par args de ligne de commande.
Vous utilisez des connexions persistantes?
Une autre chose à essayer est d'avoir le client MySQL défini MYSQL_OPT_RECONNECT
vous rencontrez probablement le même problème que est couvert par cette autre question SO: " MySQL server has gone away » avec Ruby on Rails
J'ai eu un problème similaire soudainement commencer (dans un code C ++) lorsque mySQL a été mis à jour.
En effet, la reconnexion automatique est réglé par défaut à 0 dans la version 5.0.3 ( http://dev.mysql.com/doc/refman/5.0/en/mysql-options.html ).
Je devais MYSQL_OPT_RECONNECT mettre dans le code « 1 ».
Note: il doit être appelé après les appels d'initialisation () mySQL et avant de faire la connexion réelle.