2009-11-01 3 views
4

Voici un aperçu de mon application:délai de connexion MySQL - MySQL server has gone away (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.. 

etc.

J'appelle establish_connection juste une fois - lors de l'initialisation de l'application . J'ai rencontré la limite de connexion d'inactivité de 8 heures de MySQL (MySQL server has gone away) et je me demande la meilleure approche à ce sujet.

Je suis passé par la source ActiveRecord et a constaté qu'il connexions serveur db pools. Alors, est-ce que je devrais idéalement créer une nouvelle connexion dans chaque demande de Web ou augmenter le paramètre de délai d'attente?

Merci pour votre temps!

Répondre

1

Merci pour toutes les réponses. MYSQL_OPT_RECONNECT semble être une bonne solution. Mais je ne suis pas sûr de savoir comment le 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 
1

Vous pouvez augmenter la variable wait_timeout pour mysqld. Il peut être défini dans le fichier de configuration ou transmis par les arguments de la ligne de commande.

Utilisez-vous des connexions persistantes?

Une autre chose à essayer est d'avoir le vous rencontrez probablement client MySQL ensemble MYSQL_OPT_RECONNECT

1

J'ai eu un problème similaire soudainement commencer (dans du code C++) quand 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 dû mettre MYSQL_OPT_RECONNECT à "1" dans le code.

Note: il doit être appelé après les appels init() mySQL et avant de faire la connexion réelle.