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

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

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

Beitrag von Christian »

Also wennn ein User den Netzstecker zieht oder im laufenden Betrieb von LAN auf WLAN umstellt, dann ist er's selber schuld und dann reicht eine Fehlermeldung.
Na deine Nutzer tun mir leid. Stell dir mal vor nen Browser entwickler würde so denken.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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 »

@christian, dann zeig mir mal den browser der nach dem Abziehen des Netzsteckers noch ohne Meldung läuft :wink:

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

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

Beitrag von mse »

Für MSEgui habe ich zu diesem Zweck die CloseTransactions() Prozedur geändert:

Code: Alles auswählen

 
procedure tmdatabase.CloseTransactions;
 
Var I : longint;
 
begin
 If Assigned(FTransactions) then begin
  For I:=FTransactions.Count-1 downto 0 do begin
   with tmdbtransaction(FTransactions[i]) do begin
    try
     EndTransaction;
    except
    end;
    finalizetransaction;
   end; 
  end;
 end;
end;
 
Das sollte dann auch funktionieren wenn in <transaction>.Action nicht caNone oder caRollback steht.

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

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

Beitrag von Christian »

Zeig mir mal nen Browser der ne Meldung macht wenn kurz das Netz weg ist. (Wohl gemerkt nicht wärend eines Requests wir müssen schon gleiches mit gleichem vergleichen)
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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

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

Beitrag von Michl »

hde hat geschrieben:Aber auch bei zeos gibt es noch ein kleines Prob; ein reconnect wenn die Verbindung fehlt ist abzufangen, aber wenn dann die Verbinbindung wiederkommt, gibts eine exception.
Danke für die Blumen :oops:

Ich habe da mal einiges probiert, ich bekomme keine Exception, wenn die Verbindung wieder da ist - wie bekommst Du die angestellt?! Evtl. liegts auch an der Zeosversion, ich nutze zur Zeit 7.2a-Trunc.
hde hat geschrieben:Übrigends bei Zeos reicht es meist, im BeforePost-Event einen Reconnect zu machen.
Machst Du das generell oder nur bei einer Exception?! Wenn generell - ist das performancemäßig vertretbar?!

@hubblec4: Das sollte trotzdem funktionieren, scheinbar hat sich da was geändert in FreePascal von 2.6.4 -> 2.7.1 (müsstest Du entsprechend anpassen).

@mse: Schade, dass Du nicht für FreePascal/Lazarus arbeitest, Du wärst bestimmt eine sehr sehr gute Unterstützung! Na, keine Lust?! :wink:

Code: Alles auswählen

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

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:Evtl. liegts auch an der Zeosversion, ich nutze zur Zeit 7.2a-Trunc.
Kann sehr gut sein, steht auf meiner ToDo-Liste das zu testen, fehlte aber bisher die Zeit.

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

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

Beitrag von mse »

Michl hat geschrieben: @mse: Schade, dass Du nicht für FreePascal/Lazarus arbeitest, Du wärst bestimmt eine sehr sehr gute Unterstützung! Na, keine Lust?! :wink:
Leider ist Lazarus für meine Zwecke nicht geeignet und bei FPC sind die Delphi-Fesseln zu eng.

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 »

Christian hat geschrieben:Na deine Nutzer tun mir leid.
Dann sag mir mal, wie du in eine Datenbank auf einem Server schreibst wenn der User den Netzstecker abgezogen hat?

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

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

Beitrag von Christian »

Also wennn ein User im laufenden Betrieb von LAN auf WLAN umstellt, dann ist er's selber schuld und dann reicht eine Fehlermeldung.
Darauf bezog ich mich, wenn jemand dauerhaft das Netz entfernt kann ,man natürlich wenig machen ausser drauf hinweisen.
Promet blendet z.b. Über die gesamte Mainform eine Panel mit dem Text "Es besteht keine Verbindung zum Datenbankserver, stellen Sie die Verbindung wieder her" und pingt alle 5 sek den Server an, wenn er wieder da ist wied das Panel wieder ausgeblendet.
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

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 »

hde hat geschrieben:bei Zeos reicht es meist, im BeforePost-Event einen Reconnect zu machen, der Connect ist dann in jedem Falle, egal ob er weg war oder nicht, wieder da
@christian, ich denke, du hast den Thread etwas zu flüchtig gelesen :wink:

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

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

Beitrag von hubblec4 »

@Michl

Ich habe mal deinen Code

Code: Alles auswählen

if not Assigned(FTrans) then  //Das hier ist neu
      CloseTrans
    else
in die SQLTransaktion.Rollback Prozedur eingebaut.

Leider bekomme ich immer noch besagten fehler.

In dem FPC bugtracker hast du aber auch die SQLTransaction.RollbackRETAINING prozedur angepasst. aber auch die sieht bei fpc2.6.4 etwas anders aus.

Ich bin da auch etwas zu unerfahren als das ich jetzt einfach in den bestehenden Sachen von Lazarus rumcoden will.
Kann man davon ausgehen das der Fehler in einer bald kommenden version behoben sein wird?

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

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

Beitrag von mse »

Hast du schon meine Version probiert?

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

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

Beitrag von Michl »

@hubblec4: Was hat Du denn für eine Action in Deiner TSQLTransaction stehen?! Konsequenterweise müsste man das tatsächlich für alle Actions fortführen. Werde das mal heute abend noch in 2.7.1 machen und den Patch neu hochladen.

PS.: Ich habe mir mal Laz. 1.2.4 mit FPC 2.6.4 installiert und das Testbeispiel gestartet, bei mir funktioniert (Änderung in Unit sqldb.pas):

Code: Alles auswählen

procedure TSQLTransaction.Commit;
begin
  if active then
    begin
      closedatasets;
      if LogEvent(detCommit) then
        Log(detCommit, SCommitting);
      if not assigned(FTrans) then
        closeTrans
      else
        if TSQLConnection(Database).commit(FTrans) then
          begin
            closeTrans;
            FreeAndNil(FTrans);
          end;
    end;
end;
 
procedure TSQLTransaction.CommitRetaining;
begin
  if active then
    begin
      if LogEvent(detCommit) then
        Log(detCommit, SCommitRetaining);
      if assigned(FTrans) then
        TSQLConnection(Database).commitRetaining(FTrans);
    end;
end;
 
procedure TSQLTransaction.Rollback;
begin
  if active then
    begin
      closedatasets;
      if LogEvent(detRollback) then
        Log(detRollback, SRollingBack);
      if not assigned(FTrans) then
        CloseTrans
      else
        if TSQLConnection(Database).RollBack(FTrans) then
        begin
          CloseTrans;
          FreeAndNil(FTrans);
        end;
    end;
end;
 
procedure TSQLTransaction.RollbackRetaining;
begin
  if active then
    begin
      if LogEvent(detRollback) then
        Log(detRollback, SRollBackRetaining);
      if assigned(FTrans) then
        TSQLConnection(Database).RollBackRetaining(FTrans);
    end;
end;
Damit ist ein Disconnect und Connect nach einer unterbrochenen Verbindung bei mir möglich.

@mse: Dein Vorschlag funktioniert deshalb bei Freepascal nicht, da FTrans=nil ist und somit es zu immer zu einer neuen Exception kommt, bevor CloseTrans aufgerufen wird. Aber mal sehen, evtl. haben die Entwickler von Freepascal noch eine ganz andere Idee?!

Code: Alles auswählen

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

mse
Beiträge: 2013
Registriert: Do 16. Okt 2008, 10:22
OS, Lazarus, FPC: Linux,Windows,FreeBSD,(MSEide+MSEgui 4.6,git master FPC 3.0.4,fixes_3_0)
CPU-Target: x86,x64,ARM

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

Beitrag von mse »

Michl hat geschrieben: @mse: Dein Vorschlag funktioniert deshalb bei Freepascal nicht, da FTrans=nil ist und somit es zu immer zu einer neuen Exception kommt, bevor CloseTrans aufgerufen wird. Aber mal sehen, evtl. haben die Entwickler von Freepascal noch eine ganz andere Idee?!
Aha. In MSEgui sieht es so aus:

Code: Alles auswählen

 
procedure TSQLTransaction.Rollback;
begin
 if active then begin
  dobeforestop;
  if checkcanevent(self,tmethod(fonbeforerollback)) then begin
   fonbeforerollback(self);
  end;
  savepointevent(spek_rollbacktrans,0);
  closedatasets;
  try
   if not (tao_fake in foptions) then begin
    tcustomsqlconnection(database).RollBack(FTrans);
   end;
  finally
   fsavepointlevel:= -1;
   CloseTrans;
   if checkcanevent(self,tmethod(fonafterrollback)) then begin
    fonafterrollback(self);
   end;
   doafterstop;
  end;
 end;
end;
 
wobei FTrans auch hier nicht nil sein sollte. Wann kann das vorkommen?

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

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

Beitrag von hubblec4 »

mse hat geschrieben:Hast du schon meine Version probiert?
nein noch nicht, da jetzt Michl aber meinte es würde eh bei FPC nicht gehen, weis ich nicht ob es sinn macht es zu testen.

Antworten