2010-11-30 7 views
2

Ich versuche, Controller-spezifische Seiten in meiner Rails-App anzuzeigen, wenn die Datenbankverbindung getrennt wird. Ich tue dies, indem ich den Mysql :: Error in der rescue_action-Methode abfange und entsprechende Seiten rendere. Wenn der mysql-Dienst allein gestoppt wird, bekomme ich die Mysql :: Error-Ausnahme wirklich schnell und ich könnte die Seiten ohne Verzögerung rendern.Wie Rails Datenbankverbindung im Hintergrund behandelt?

Aber wenn der Server selbst heruntergefahren wird, dauert Rails 3 Minuten, um den Mysql :: Error zu werfen und nach 5-6 Anfrage reagiert die ganze Website nicht mehr.

Ich habe versucht herauszufinden, welche Methode im Rails Framework so lange dauert, wenn der MySQL Server heruntergefahren ist. Es war eine Methode connection.real_connect (in der aktiven Datei mysql_adapter), die 3 Minuten dauerte, um mit einer Ausnahme zurückzukehren.

Also habe ich beschlossen, diese Methode mit systemTimer gem auszusetzen. Dieser Affe-Patch funktionierte perfekt, wenn ich die Website mit Datenbankverbindung starte und den Datenbankserver sofort heruntergefahren habe.

Aber wenn ich die Website mit Datenbank starten, und für einige Zeit auf die Website zugreifen und dann den Datenbankserver herunterfahren, funktioniert es überhaupt. und die gesamte Website reagiert nicht mehr wie zuvor. Ich frage mich, was ist der Unterschied zwischen den beiden Szenarien.

Ich denke, ich muss mehr im Detail darüber wissen, wie Schienen Datenbankverbindung handhaben. Wie reagiert es, wenn die Datenbankverbindung unterbrochen wird? so dass ich genaue orte identifizieren konnte, wo ich affe-patches anbringen kann und es für meine spezifische anforderung funktionieren lässt. Ich habe keinen relevanten Artikel gesehen, der das erklärt.

Jede Hilfe wird für mich

Dank sehr nützlich sein,

Antwort

4

ich nicht versucht habe, aber Sie können connect_timeout als eine der angegebenen Optionen (zusammen mit Port, Host, etc.) hinzu die MySQL-Verbindung in der Datei database.yml. Dieser Wert wird an den Aufruf real_connect übergeben, um die Verbindung zu MySQL herzustellen.

Da nach der ersten Verbindung und dem Herunterfahren der Datenbank eine Verzögerung auftritt, müssen Sie möglicherweise die Konfigurationsoption read_timeout verwenden.

+0

ich denke, ich muss diesen Patch https://github.com/rails/rails/commit/d3a802cee0f8cbe209af8886f8f8e8cab204d21a setzen, um die Timeouts in meiner Datenbank.yml-Datei festzulegen. Ich benutze eine alte Version von Schienen (2.1) – anusuya

+1

Ja, sollte angegeben haben, dass die hinzugefügten Konfigurationsoptionen, die ich sah, in Schienen sind 3 –

+0

Ich habe diesen Patch hinzugefügt (https://github.com/rails/rails/commit/d3a802cee0f8cbe209af8886f8f8e8cab204d21a) in meinen Schienen. und setzen Sie die Werte connect_timeout read_timeout und write_timeout in der Datei database.yml. die write timeout scheint zu funktionieren (schalte ich den datbase server kurz nach dem start der website aus, gibt es keine verzögerung). Ich denke nicht, dass die Lese-Timeout gesetzt wird, als wenn ich den Db-Server nach einiger Zeit geschlossen. Die Website wird un reaktionsfähig wie zuvor :(jede Idee, warum das passiert – anusuya

Verwandte Themen