Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Connection Exception nach Ruhezustand / Sleep (https://www.delphipraxis.net/207679-connection-exception-nach-ruhezustand-sleep.html)

fabi17 22. Apr 2021 08:26

Connection Exception nach Ruhezustand / Sleep
 
Hallo zusammen,

ich habe ein relativ großes Programm zum Erfassen von Daten mit mehreren Usern geschrieben. Nun kommt es ab und zu vor, dass ein User das Programm über Nacht offen lässt und am nächsten Morgen, nachdem der PC dann aus dem Standby erwacht, dann eine Exception (ADO) mit Fehler beim Verbinden bekommt sobald er im Programm etwas macht. Was ist hierzu der beste Weg, die Exception abzufangen und die Verbindung wiederherzustellen?

Lg
Fabi

hoika 22. Apr 2021 08:42

AW: Connection Exception nach Ruhezustand / Sleep
 
Hallo,

Delphi-Quellcode:
try
  CheckConnection;
except?
  Reconnect;
end;

TigerLilly 22. Apr 2021 08:56

AW: Connection Exception nach Ruhezustand / Sleep
 
Wenn es nur definierte Stellen gibt, an denen das Programm sich befinden kann, kannst du testen + reconnecten. Sonst müsstest du vor jedem Zugriff (zB DataSet.Next) auf die DB testen + das geht nicht immer, weil damit auch der Context verlorengeht. Vielleicht wäre es eine Option, das Programm bei Inaktivität zu schließen? Oder wenigstens auf einen definierten Punkt zurückzufahren?

fabi17 22. Apr 2021 09:11

AW: Connection Exception nach Ruhezustand / Sleep
 
Hi,

ich hatte mir eine andere (globale) Lösung als try, except erhofft (ggf. mit timer?), da ich sonst in dutzende Prozeduren reinspringen muss...

hoika 22. Apr 2021 09:14

AW: Connection Exception nach Ruhezustand / Sleep
 
Hallo,
vor jeder Methode ein TryConnect machen.

fabi17 22. Apr 2021 09:21

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von TigerLilly (Beitrag 1487565)
Wenn es nur definierte Stellen gibt, an denen das Programm sich befinden kann, kannst du testen + reconnecten. Sonst müsstest du vor jedem Zugriff (zB DataSet.Next) auf die DB testen + das geht nicht immer, weil damit auch der Context verlorengeht. Vielleicht wäre es eine Option, das Programm bei Inaktivität zu schließen? Oder wenigstens auf einen definierten Punkt zurückzufahren?

hatte auch überlegt, das Programm nachts einfach zu schließen. Aber wenn der User noch Forms offen hat und ich die exe von außerhalb schließe, wird das Fromclose Event nicht ausgeführt, oder?

fabi17 22. Apr 2021 09:22

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von hoika (Beitrag 1487567)
Hallo,
vor jeder Methode ein TryConnect machen.

danke, wenn es keine andere Lösung gibt, muss ich das so machen...

Jasocul 22. Apr 2021 09:50

AW: Connection Exception nach Ruhezustand / Sleep
 
Das Problem kommt mir bekannt vor, wenn auch in anderer Konstellation. Bei uns gibt es eine Anwendung, die im mobilen Arbeiten genutzt wird. Es besteht daher immer das Risiko, dass die Verbindung verloren geht. Also gilt das Prinzip, keine datensensitiven Komponenten zu verwenden. Die DB-Verbindung wird nur genutzt, wenn es erforderlich ist. Sie wird zwar nach Möglichkeit offen gehalten, aber wenn die weg ist, kann halt nicht aktualisiert/gespeichert werden. Im schlimmsten Fall gehen die Arbeiten zwischen 2 Kontrollpunkten im Programm verloren.

1. Du könntest dein Programm ähnlich anpassen, was ziemlich viel Aufwand sein könnte.
2. Du baust an allen wichtigen Stellen eine Connect-Prüfung ein und reagierst mit einem Reconnect. Die datensensitiven Elemente verlieren dann aber auch die Daten. Übrigens muss ein Reconnect auch nicht immer funktionieren.
3. Du machst den Anwendern klar, dass eine Datenbankanwendung ein Time-Out kriegen kann. Die Konsequenzen sind dann eben, dass die zuletzt erfassten Daten futsch sind. Wenn die Daten so dramatisch wichtig sind, sollten die sowieso zu ende erfasst werden. Wenn sie nicht so wichtig sind, dürfte es auch kein Drama sein, diese nochmal zu erfassen.

Im schlimmsten Fall kann es sogar passieren, dass die tägliche Datenbanksicherung blockiert wird, wenn die Anwendung noch aktiv ist. So einen Fall hatten wir vor 2 Jahren auch mal.
Ich würde einen Timer einbauen, der die Verbindung prüft und gegebenenfalls die Anwendung beendet. Man kann dann ja noch eine Warnung ausgeben, dass die Anwendung in x Minuten wegen Inaktivität/Verbindungsfehler geschlossen wird.

Zitat:

Zitat von fabi17 (Beitrag 1487568)
Aber wenn der User noch Forms offen hat und ich die exe von außerhalb schließe, wird das Fromclose Event nicht ausgeführt, oder?

Du kannst ja im Programm durchgehen, welche Forms offen sind und diese dann über ein Close schließen. Das FormClose müsste dann auch ausgeführt werden.

Bernhard Geyer 22. Apr 2021 10:11

AW: Connection Exception nach Ruhezustand / Sleep
 
Wir reagieren auf die Windows-Events und beenden die DB-Verbindung.
Beim wiederaufwachen des REchners wird die Verbindung wieder aufgebaut.

alex517 22. Apr 2021 13:11

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1487574)
Wir reagieren auf die Windows-Events und beenden die DB-Verbindung.
Beim wiederaufwachen des REchners wird die Verbindung wieder aufgebaut.

Auf welche Windows-Events reagiert ihr?

Alex

HolgerX 22. Apr 2021 17:05

AW: Connection Exception nach Ruhezustand / Sleep
 
Hmmm..

Irgendwas habe ich da im Kopf, dass es bei ADO die Möglichkeit gibt, Automatisch die Verbindung bei Nichtverwendung zu trennen und wieder zu verbinden.

Das war glaube ich eine Einstellung in der ADO-Connection, bzw. im Connectionstring.

Somit nur an einer Stelle ein Änderung und die Connection verbindet sich wieder neu.

fabi17 23. Apr 2021 12:37

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von HolgerX (Beitrag 1487640)
Hmmm..

Irgendwas habe ich da im Kopf, dass es bei ADO die Möglichkeit gibt, Automatisch die Verbindung bei Nichtverwendung zu trennen und wieder zu verbinden.

Das war glaube ich eine Einstellung in der ADO-Connection, bzw. im Connectionstring.

Somit nur an einer Stelle ein Änderung und die Connection verbindet sich wieder neu.

Das wäre das was ich mir wünschen würde! nur dazu kann ich nichts finden.

Zitat:

Zitat von Jasocul (Beitrag 1487571)
Ich würde einen Timer einbauen, der die Verbindung prüft und gegebenenfalls die Anwendung beendet. Man kann dann ja noch eine Warnung ausgeben, dass die Anwendung in x Minuten wegen Inaktivität/Verbindungsfehler geschlossen wird.

danke, das werde ich einmal prüfen!

Zitat:

Zitat von alex517 (Beitrag 1487594)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1487574)
Wir reagieren auf die Windows-Events und beenden die DB-Verbindung.
Beim wiederaufwachen des REchners wird die Verbindung wieder aufgebaut.

Auf welche Windows-Events reagiert ihr?

Alex

Das würde mich auch interessieren! :)

Dalai 23. Apr 2021 12:43

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von alex517 (Beitrag 1487594)
Auf welche Windows-Events reagiert ihr?

Auch wenn ich nicht gefragt war, schätze ich mal, dass das übliche MSDN-Library durchsuchenWM_POWERBROADCAST gemeint ist, mit den üblichen wParams PBT_APMRESUMESUSPEND, PBT_APMRESUMESTANDBY, PBT_APMSUSPEND und PBT_APMSTANDBY.

Grüße
Dalai

HolgerX 23. Apr 2021 17:16

AW: Connection Exception nach Ruhezustand / Sleep
 
Hmmm...

Zitat:

Zitat von fabi17 (Beitrag 1487687)
Zitat:

Zitat von HolgerX (Beitrag 1487640)
Hmmm..

Irgendwas habe ich da im Kopf, dass es bei ADO die Möglichkeit gibt, Automatisch die Verbindung bei Nichtverwendung zu trennen und wieder zu verbinden.

Das war glaube ich eine Einstellung in der ADO-Connection, bzw. im Connectionstring.

Somit nur an einer Stelle ein Änderung und die Connection verbindet sich wieder neu.

Das wäre das was ich mir wünschen würde! nur dazu kann ich nichts finden.

Schau dir mal die Hilfe zu 'KeepConnection' der TADOConnection an.
Wenn diese Property auf False gestellt wird, sollte sich die ADOComponente automatisch trennen...

(Ist halt schon was her, wie ich das gehört hatte...)

alex517 25. Apr 2021 12:28

AW: Connection Exception nach Ruhezustand / Sleep
 
Zitat:

Zitat von Dalai (Beitrag 1487689)
Zitat:

Zitat von alex517 (Beitrag 1487594)
Auf welche Windows-Events reagiert ihr?

Auch wenn ich nicht gefragt war, schätze ich mal, dass das übliche MSDN-Library durchsuchenWM_POWERBROADCAST gemeint ist, mit den üblichen wParams PBT_APMRESUMESUSPEND, PBT_APMRESUMESTANDBY, PBT_APMSUSPEND und PBT_APMSTANDBY.

Grüße
Dalai

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:04 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz