MYSQL: ein reconnect nach "Server is gone away" durchführen

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

MYSQL: ein reconnect nach "Server is gone away" durchführen

Beitrag von hubblec4 »

Hallo

Ich verwendet MySQL in meinem programm. Es kommt abundzu vor das "anscheinend" im netzwerk etwas nicht stimmt und ich erhalte abundzu die fehlermeldung
"Server is gone away"

man liest sehr viel dazu das es an einem timeout liegt, das ist hier definitiv nicht der fall.
ich habe das ganze soweit simulieren können: ich nutze XAMPP und dort kann ich nach dem mein programm gestartet ist die MySQL-verbindung beenden und dann gleich wieder starten.
Dadurch kommt es dann zu besagter Fehlermeldung in meinem Programm.

wenn ich mein programm dann schliesse und neu starte ist alles wieder schick und funktioniert.

ich würde aber gerne diesen fehler auffangen (mit try except) und dann einen automatischen reconnect durchführen lassen.

Allerdings funktioniert das nicht.
kurz mal zum aufbau (verwendete komponenten)
1. SQL_Library_Loader
2. SQL_Connector
3. SQL_Transaction
4. SQL_Query
5. Data_Source

wenn mein programm startet werden alle nötigen einstellungen aus dem Quellcode heraus gesetzt.

stosse ich nun auf einen solchen "gone away" fehler wollte ich den SQL_Connector auf "connected:=false" setzen aber auch hierbei stürtzt mein programm ab mit der gleichen "gone away" fehlermeldung. selbiges passiert mit "SQL_Transaction.active:=false"

Wie erreiche ich es das ich eine neue verbindung zum SQL server aufbauen kann ohne mein programm neustarten zu müssen.


LG
hubble

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hde »

Zu den Modulen SQLdb kann ich nichts sagen, denn wenn ich Lazarus einsetze dann auch Zeos.
"Server is gone away" ist aber eine typische Meldung von mySQL wenn das Timeout zur automatischen Trennung der Clients nicht hochgesetzt wurde.
Beim Einsatz von mySQL das auf einem Fremdrechner bei einem Provider läuft ist es oft icht abzustellen.
Frage: Warum setzt du XAMPP ein? Gehst du übers externe Inteernet? Dann prüf die Einstellungen von XAMPP

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

Es gibt keinen besonderen grund warum ich XAMPP nutze, ausser vll das es einfach ging und schon da war.
Es läuft dort MySQL 5.5.xxx und der SQL_Libraray_Loader lädt auch die entsprechende mysql.dll ordnungsgemäss.

das "... gone away" problem ist wirklich nicht wegen den timeout!
Es gibt ein netzwerk mit einem server, worauf XAMPP/MySQL läuft und weitere rechner die sich darauf einloggen und mit der DB kommunizieren.

Es ist der fall aufgetreten das es probleme im netzwerk gab (Antiviren progs welche die MySQL verbindung zurücksetzen oder so...; Netzwerkkabel die nicht korrekt angeschlossen waren; und andere kleinigkeiten die mit dem netzwek zu tun haben)

Ebenso wenn ein rechner von LAN auf WLAN umstellt geht die SQL verbindung verloren und besagter fehler tritt auf.

Nach einem Programmneustart geht ja auch alles gleich sofort wieder.

ich habe bei dem SQLConnector eine property entdeckt:

Code: Alles auswählen

SQLConnector.ConnOptions

leider weis ich nicht genau was sie bewirkt und wie sie zu bedienen ist.

was mich halt wundert ist, dass ich den SQLConnector nicht auf "connected:=false" setzen kann, weil dann ebnfalls besagte fehlermeldung kommt.

MmVisual
Beiträge: 1466
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von MmVisual »

Es gibt noch ein anderer Umstand:
Wenn ein Datensatz gerade im Editier-Modus ist und dann die Verbindung abbricht?
Wenn man dann ein Disconnect/Connect macht, dann werden alle Tabelle in jedem Fall geschlossen und der editierte Eintrag ist weg, da noch nicht gespeichert.
Was soll dann passieren?

Ich habe auch das "Reconnect" Problem mit MySQL. Da ich dafür auch keine wirklich saubere Lösung gefunden habe, lasse ich es einfach "knallen" mit dem Fehlerhinweis und der User muss dann die EXE restarten und weiß dann auch genau dass er den zu Letzt bearbeiteten Datensatz kontrollieren muss wenn er noch nicht gespeichert war.

Damit die Verbindung nicht einfach so abhaut habe ich einen Timer drin, der alle paar Sekunden einen Parameter (1 Datensatz einer kleinen Tabelle) abfrägt.

PS: Ich nutze Zeos. Es wäre natürlich super wenn ZEOS automatisch einen Reconnect machen könnte, dann wäre auch das Problem mit dem gerade im Edit-Mode befindlichen Datensatz gelöst.
@hde: Du kennst Dich doch supergut mit Zeos aus, gibt es dafür eine Lösung?

Grüße Markus.
EleLa - Elektronik Lagerverwaltung - www.elela.de

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

hi MmVisual

danke für deine antwort, und schade auch zu lesen das du das gleiche problem hast.

für den moment habe ich da auch eine "ich lass es abstürtzen und man kann die Progg.exe automatisch neustarten lassen lösung" eingebaut.
Ist allerdings nicht wirklich eine gute lösung, da sich der user erst wieder einloggen muss dann alles einstellen...usw.

Zeos sagt mir jetzt leider gar nichts. was ist das und würde das was bringen?

Wie gesagt einen timer einbauen hatte ich auch vor, und auch testhalber mal ausprobiert: aber daran scheitert es nunmal nicht. selbst nach 6h ist der Server ordnungsgemäss erreichbar, sollte vorher nicht irgendwas im netzwerk passiert sein.

wieso muss der SQLConnector beim beenden des connect-status nochmal die verbindung prüfen?
SQLConnector.connected:=false sollte doch eigentlich alles trennen und nicht nochmal prüfen ob die verbindung besteht.


Eine überlegung fällt mir noch ein:
Da mein SQLConnector und alle anderen Komponeten bereits auf der Form liegen und in der Form.Create prozedur alles eingestellt wird,
frage ich mich was passiert wenn man die ganzen komponeten zur laufzeit erst erzeugt und diese dann bei einem fehler "zerstört", -> neuerzeugt -> sollte es dann gehen?

hubble

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hde »

MmVisual hat geschrieben:@hde: Du kennst Dich doch supergut mit Zeos aus, gibt es dafür eine Lösung?

Hallo Markus, das ist ja nun voll übertrieben. :wink:
das meiste bei uns läuft noch über andere DBs und Systeme. Mit mySQL und Zeos haben wir aber nirgendwo das Problem seit wir die Timeouts konsequent einstellen und ebenso konsequent Tansactions nutzen. (Leider verhindern aber einige Provider das Hochsetzen der Timeouts). Ich werde mich aber nochmal um das Prob kümmern, bin aber heute (und vl. auch morgen) mit anderen Dingen völlig zugestopft.
Gruß hde

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

hubblec4 hat geschrieben:Eine überlegung fällt mir noch ein:
Da mein SQLConnector und alle anderen Komponeten bereits auf der Form liegen und in der Form.Create prozedur alles eingestellt wird,
frage ich mich was passiert wenn man die ganzen komponeten zur laufzeit erst erzeugt und diese dann bei einem fehler "zerstört", -> neuerzeugt -> sollte es dann gehen?

hubble



Einen kleinen Erfolg möchte ich an der stelle mal kund tun.

Ich habe in meinem Programm die festen auf der Form liegenden Komponenten (SQLConnector und SQLTransaction) nicht verwendet. Statt dessen lasse ich sie zur laufzeit im Form.Create als Globale variable erzeugen.

Alle nötigen daten wie hostname und datenbank usw. werden ebenfalls dort gesetzt.

in einer prozedur (backup) habe ich dann eine prüfung der SQL-verbindung eingebaut.

ist die verbindung unterbrochen worden (...gone away -error) erhält der User die möglichkeit das programm neu zu starten oder es "noch einmal" mit dem backup zu probieren.

wird "noch einmal" ausgewählt werden die globalen variablen SQLConnector und SQLTransaction neu erzeugt(mit allen notwendigen daten).
Ergebnis: das backup läuft ohne probleme durch.
(die "alten" SQL-variabeln lassen sich allerdings nicht zerstören oder beenden, es kommt dann auch der "... gone away"-error)

es tritt eben nicht nur der besagte "... gone away" error auf sondern noch ein ähnlicher.

Lost Connection during Query (so ähnlich)
ich gehe mal davon aus das ich diesen fehler auch auffangen kann(konnte es aber nicht testen).

Die rechner in diesem netzwerk sind sehr verschieden und schlecht eingerichtet. Habe das chaos so übergeben bekommen.
auf jedenfall wird die sql-verbindung immer mal wieder unterbrochen und ich weis nicht wodurch.

jus
Beiträge: 50
Registriert: Fr 6. Mai 2011, 13:29

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von jus »

Ich habe eine Kassasoftware für einen Bekannten in Delphi geschrieben, die auf eine MySQL Datenbank von deren Webshop zugreift, das extern bei einem Webhostprovider gehostet ist. Ich hatte das Problem, dass nach einiger Zeit die Verbindung zur MySQL-Datenbank abbricht, wenn keine Anfragen mehr gesendet werden. Ich habe das Problem damit gelöst, dass ich alle 2 Minuten über einen Timer einen Ping

Code: Alles auswählen

mysql_ping(_mysql: PMYSQL);
zur MySQl-Datenbank schicke. Seitdem läuft die Kassasoftware auch eine Woche ohne Verbindungsabbruch durch. Vielleicht hilft es auch in deinem Fall.

Lg,
jus

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

jus hat geschrieben:Ich habe eine Kassasoftware für einen Bekannten in Delphi geschrieben, die auf eine MySQL Datenbank von deren Webshop zugreift, das extern bei einem Webhostprovider gehostet ist. Ich hatte auch das Problem, dass nach einiger Zeit habe die Verbindung zur MySQL-Datenbank abbricht, wenn keine Anfragen da sind. Ich habe das Problem damit gelöst, dass ich alle 2 Minuten über eine Timer einen Ping

Code: Alles auswählen

mysql_ping(_mysql: PMYSQL);
zur MySQl-Datenbank schicke. Seitdem läuft die Kassasoftware auch eine Woche ohne Verbindungsabbruch durch.

Lg,
jus



ok, nur leider hat mein fehler nicht die ursache eines timeouts.

selbst wenn die rechner stunden lang nichts zu tun haben kann es sein das alles geht. aber manchmal nach ein paar aktionen kommt der Fehler.


und auf keinen fall darf man vergessen das wenn ein rechner von LAN auf WLAN umstellt (internet geht ja dann auch wieder weiter) die sql-verbindung abbricht.
spätestens hier bekommt man den "gone away"-error.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von Michl »

Möglicher Workaround: Wenn Du den TimeOut nicht ändern kannst, könntes Du auch proaktiv mit einem Timer alle ... Minuten die Verbindung trennen und wieder verbinden?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

Michl hat geschrieben:Möglicher Workaround: Wenn Du den TimeOut nicht ändern kannst, könntes Du auch proaktiv mit einem Timer alle ... Minuten die Verbindung trennen und wieder verbinden?!


denke das wird nicht so einfach, was wenn gerade eine anfrage statt findet und die Trennung eingeleitet wird, weil der timer abgelaufen ist.
dann bekommt man wieder diesen Fehler.

Ich bin bis jetzt mit meinem Workaround recht zu frieden. muss da aber sich noch paar situationen testen.
dennoch würde ich gern weitere meinungen und anregungen hören wollen. vll gibt es ja doch noch andere möglichkeiten einen reconnect zu erstellen.

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von Michl »

hubblec4 hat geschrieben:denke das wird nicht so einfach, was wenn gerade eine anfrage statt findet und die Trennung eingeleitet wird, weil der timer abgelaufen ist.
dann bekommt man wieder diesen Fehler.
Ich denke, das ist dann ein anderer Fehler (wie Du auch schriebst) - möglicherweise hast Du noch irgendwas offen, was dann nicht abgeschlossen werden kann, da die Connection weg ist.

Ich habe auch verschiedene Test gemacht, ich bekomme den Fehler beim "MySQL56Connection1.Connected:=False;" nicht erstellt (Win7 64bit, MySQL5.6, Lazarus 1.3 r45856M FPC 2.7.1 i386-win32-win32/win64). Kannst Du ein Minimalbsp. erstellen, das bei Dir die Exception bei "Connected:=False" auslöst und hier hochladen und sagen, welche Versionen (OS, MySQL, Lazarus) Du einsetzt?!

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

hubblec4
Beiträge: 341
Registriert: Sa 25. Jan 2014, 17:50

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hubblec4 »

Ich verwende win7 64bit, Lazarus1.2.2 32bit, FPC2.6.2(müsste das noch sein), MySQL5.5/XAMPP.

Das hochladen eines miniprogramms wird nicht so einfach möglich sein.

den fehler erzeugen mache ich wie folgt.

XAMPP läuft, ControlPanel ist offen, MySQL ist gestartet.
Ich starte mein programm (dabei wird bereits schon auf die DB zugeriffen, alles läuft prima).
Im ControlPanel von XAMPP stoppe ich den MySQL dienst und starte ihn gleich wieder.
Im Programm wird dann eine aktion ausgeführt welche auf die DB zugreift.
(testhalber habe ich meinen workaround für die backup-funktion mal eingebaut)
backup kann nicht ausgeführt werden weil "..gone away"-error.

mit dem workaround wird dann der fehler aufgefangen und eine neue verbindung aufgebaut und das backup kann erstellt werden..

hde
Beiträge: 556
Registriert: Mi 11. Aug 2010, 02:56

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von hde »

Michl hat geschrieben:Möglicher Workaround: Wenn Du den TimeOut nicht ändern kannst, könntes Du auch proaktiv mit einem Timer alle ... Minuten die Verbindung trennen und wieder verbinden?!

Sry Michl, aber diesmal "verschlimmbessert" dein Vorschlag und erzeugt neue Probleme. Wenn es nur um die Timeouts ging reicht ein ping (wie hier schon vorgeschlagen wurde) oder der Mini-Select von Markus. An die Performance geht das nur, wenn der Fremdprovider den Timeout auf 10sec oder noch kleiner stellt.

@hubblec4,
1. nochmals: warum mySQL unter XAMPP und nicht als Windows-Dienst? XAMPP macht das generell etwas unsicherer.
2. dein Testcase MUSS Fehler erzeugen weil du die Verbindung brutal abbrichst. Wenn du eine sichere non-stop-verbindung willst setz auf einen Spiegelserver oder eine Replikation-DB.

Aber auch wenn wir bei unserer Arbeitsweise keine derartigen Probs mehr haben, werd ich mir die Sache nochmal vornehmen - sobald ich etwas Luft kriege.

hde

Michl
Beiträge: 2505
Registriert: Di 19. Jun 2012, 12:54

Re: MYSQL: ein reconnect nach "Server is gone away" durchfüh

Beitrag von Michl »

@hde: Recht hast Du! :wink: War eher laut gedacht zu:
hubblec4 hat geschrieben:Ich habe in meinem Programm die festen auf der Form liegenden Komponenten (SQLConnector und SQLTransaction) nicht verwendet. Statt dessen lasse ich sie zur laufzeit im Form.Create als Globale variable erzeugen.
...
wird "noch einmal" ausgewählt werden die globalen variablen SQLConnector und SQLTransaction neu erzeugt(mit allen notwendigen daten).
Ergebnis: das backup läuft ohne probleme durch.


@hubblec4: Wenn Du der Verbindung den Boden unter den Füßen wegziehst,
hubblec4 hat geschrieben:Im ControlPanel von XAMPP stoppe ich den MySQL dienst und starte ihn gleich wieder.
muss es doch zu einer Exception kommen. Das hatte ich so nicht verstanden. Logisch kommt es dann zu der Fehlermeldung, wenn Du danach versuchst die Connection ordentlich zu trennen.

Dann ist das Abfangen dieser Exception (und wenn Du Deinem User sogar ein Backup anbietest) doch eine gute Lösung! Ansonsten solltest Du wohl eher an der Struktur des Netzwerks etwas tun, aber das hat hde ja schon geschrieben.

[Edit] Ich habe mal das TimeOut auf 2 Sekunden heruntergesetzt und auch Zeos gegengetestet. Beim Edit, Insert, Delete kommt es bei SQLdb und Zeos zu Exceptions - wie erwartet. Bei "Connection.Connected:=False;" nur bei SQLdb.

Code: Alles auswählen

type
  TLiveSelection = (lsMoney, lsChilds, lsTime);
  TLive = Array[0..1] of TLiveSelection; 

Antworten