![]() |
Datenbank: FB • Version: 1.5 • Zugriff über: FIBPlus, BDE ...
Connected=True während der ganzen Programmlaufzeit ?
Hallo #,
naja, der Text der Überschrift ist begrenzt ;) Wie macht ihr das mit dem Connected 1. Connected = True beim Programmstart Connected = False beim Programmende 2. Connected = True vor jeder Transaktion Connected = False danach Ich benutze zur Zeit die 1. Variante. Das Connect dauerte (damals IB6) je nach Server/Netzwerk ziemlich lange (0.5 sek). Jetzt habe ich das Problem, dass bei "schlechtem" Netzwerk mal die Verbindung abreisst -> böser SQL-Fehler wird angezeigt. OK, man könnte vor jedem Transaktion-Start prüfen, ob die Verbindung noch da ist, und zur Not die Verbindung wieder aufbauen. Die 2. Variante finde ich aber besser. Nur, wie sieht es mit dem Laufzeitverhalten aus ? Ein Connection-Pool gibt es ja leider (für FB) nicht. Nutzt jemand die 2. Variante und hat praktische Erfahrungen damit ? Zum 1. Wie kann ich schnell feststellen, ob die Verbindung noch besteht ? Danke Heiko |
Re: Connected=True während der ganzen Programmlaufzeit ?
Habe mal nachgesehen, im (Haupt)DataModuleCreate steht bei mir Database.Open und eine Transaktion wird gestartet. Lost Connection wegen Netzwerkkabel ziehen und so ? :lol: Guck mal dazu auf den FibPlus Seiten. Da müsste genaue Anleitung sein. Sie haben auch spezielle Ereignisse für Database und Dataset. OnLostConnect, DatabaseDisconnect usw. Siehe Artikel.
|
Re: Connected=True während der ganzen Programmlaufzeit ?
JDBC schickt z.B. vor jedem SQL-Knödel ein 'SELECT 1' zum Server.
|
Re: Connected=True während der ganzen Programmlaufzeit ?
Hallo
> Hansa Meinst du den ? ![]() > alzaimar Unter FB wäre das eine select 1 from rdb$database exec: 3 ms, fetch: 11 ms Ist eine schöne Belastung fürs Netzwerk ;( Heiko |
Re: Connected=True während der ganzen Programmlaufzeit ?
Zitat:
Wenn es anders geht, dann wäre das natürlich besser. Ich würde das Verschicken vielleicht zentral kapseln und über ein Try-Except erst die Verbindung ggf. neu aufbauen und danach einen neuen Versuch starten. Ich denke mir, das es auch bei FB zu Deadlock-Situationen kommen kann, bei denen man einen ansonsten unkritischen Befehl nochmals schicken muss. Ich mach das jedenfalls so (bei Deadlock max 3x, ein Reconnect max 1x). Ich hab mir eh abgewöhnt, mit datensensitiven Steuerelementen zu arbeiten, bastle mir meine SQL selber zusammen und schicke sie über eine einzige Routine, die dann die ganze Deadlock, Reconnect etc. -Logik ausführt. So kann ich mir meine SQL-Batches zu |
Re: Connected=True während der ganzen Programmlaufzeit ?
Zitat:
Zitat:
|
Re: Connected=True während der ganzen Programmlaufzeit ?
Hallo,
die Transaction-Befehle habe ich auch gekapselt, dort könnte ich das mit reinpacken. Heiko |
Re: Connected=True während der ganzen Programmlaufzeit ?
Zitat:
Delphi-Quellcode:
Function ExecuteSQL (Const anSQLStmt : String) : TExecuteResult;
Procedure _InnerExecute; Var iRetryCount : Integer; Begin Result := erNone; iRetryCount := 0; Repeat Try Connection.Execute (anSQLStmt); Result := erOK; Except On E:EDeadLockException Do Begin Result := E.SQLResult; inc (iRetrycount); Sleep (DELAY_ON_DEADLOCK); End; On E:ESQLException Do Result := E.SQLResult; End; Until (Result <> erNone) or (RetryCount = MAXRETRIES_ON_DEADLOCK); // z.B. 3 End; Begin Try _InnerExecute; Except On E:ELostConnectionException Do Begin Reconnect; _InnerExecute; End End End; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz