![]() |
Datenbank: InterBase • Version: 6.1 • Zugriff über: IBObjects
Programm friert bei Open ein -> Fehler in gds32.dll
Delphi 5
Hallo, der Fehler tritt unregelmäßig und unabhängig vom ausgeführten SQL an verschiedenen Stellen im Programm auf. Das Bild ist immer das gleiche: Zugriffsverletzung in CharUpperBuffA [2] während Query.Open [1] -> Query wird freigegeben [3] und das Programm hängt bei WaitForMultipleObjects [4].
Delphi-Quellcode:
Query := TIBOQuery.Create(IB_Connection);
try Query.IB_Connection := IB_Connection; Query.KeyLinksAutoDefine := GetEditableSelectResult; Query.RequestLive := GetEditableSelectResult; Query.SQL.Append(SQL); try Query.Open; // [1] except on E:Exception do begin Log('Fehler beim Öffnen der Query'#13#13 + 'Fehlermeldung:'#13 + E.Message + #13#13 + 'Fehlerverursachendes SQL:'#13 + Query.SQL.CommaText); raise; // Ausführung der Prozedur trotzdem abbrechen, Query freigeben end; end; try // Tue Was finally Query.Close; end; finally Query.Free; // [3] hier hängt er sich auf - siehe Callstack end;
Code:
Ist euch so etwas schon einmal untergekommen? Was würdet ihr tun, um das zu verhindern? Das Programm wird in einem Callcenter benutzt während wir mit den Anrufern sprechen. Solche Hänger kommen mehrfach täglich vor. Ist natürlich ungünstig, wenn das mitten im Gespräch passiert...
7c91df48 +00a ntdll.dll NtWaitForMultipleObjects [4]
7c80958a +000 kernel32.dll WaitForMultipleObjectsEx 7c80a110 +013 kernel32.dll WaitForMultipleObjects 40547176 +003 gds32.dll gds__thread_enter 40543b85 +065 gds32.dll isc_dsql_free_statement 00522e77 +107 CCCClient.exe IB_Components TIB_Statement.SysUnprepare 005220b5 +065 CCCClient.exe IB_Components TIB_Statement.SysDeallocate 00521484 +030 CCCClient.exe IB_Components TIB_Statement.Unprepare 0055144f +01b CCCClient.exe IBDataset TIBODataset.Unprepare 005509a4 +014 CCCClient.exe IBDataset TIBODataset.Destroy [3] 00403a5c +008 CCCClient.exe System 3530 +4 TObject.Free 00d55017 +137 CCCClient.exe CZ_Lib 351 +33 ExecuteSQL 0040423a +02a CCCClient.exe System 4715 +15 @HandleFinally 7c93ab7c +103 ntdll.dll RtlUnwind 004041b6 +12e CCCClient.exe System 4654 +141 @HandleOnException 7c91e485 +009 ntdll.dll KiUserExceptionDispatcher 7e36aebf +080 user32.dll CharUpperBuffA [2] 40542ddb +16e gds32.dll isc_dsql_execute2_m 40542bda +183 gds32.dll isc_dsql_execute2 40542a4e +01a gds32.dll isc_dsql_execute 00523ff0 +050 CCCClient.exe IB_Components TIB_Statement.API_Execute 00529d7d +005 CCCClient.exe IB_Components TIB_Dataset.SysExecSelect 00523219 +071 CCCClient.exe IB_Components TIB_Statement.SysExecStatement 00522f90 +098 CCCClient.exe IB_Components TIB_Statement.SysExecute 00529b98 +060 CCCClient.exe IB_Components TIB_Dataset.SysExecute 0052955f +10b CCCClient.exe IB_Components TIB_Dataset.SysOpen 0052919c +048 CCCClient.exe IB_Components TIB_Dataset.Open 00552798 +13c CCCClient.exe IBDataset TIBODataset.InternalOpen 004d1c9e +022 CCCClient.exe Db 8260 +2 TDataSet.DoInternalOpen 004d1d6e +02e CCCClient.exe Db 8289 +4 TDataSet.OpenCursor 004d1c09 +05d CCCClient.exe Db 8242 +12 TDataSet.SetActive 004d1a6a +00e CCCClient.exe Db 8203 +1 TDataSet.Open [1] 00d54f66 +086 CCCClient.exe CZ_Lib 334 +16 ExecuteSQL |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Warum Append?
Besser
Delphi-Quellcode:
direkt setzen.
Query.SQL.Text
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Korrekt! :roll: Hilft aber leider nicht bei der Problemlösung. :( Ich werde es trotzdem ändern. :wink:
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Weise Deinem Query eine explizite TIB_Transaction zu.
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
@neo4a:
Kannst du mich zu den Hintergründen deines Lösungsansatzes aufklären? Soweit ich weiß, startet IBO eine Standardtransaktion, die überall verwendet wird, wo nicht explizit eine andere Transaktion angegeben wird. Aktuell verwenden wir nur diese Standardtransaktion und nutzen das AutoCommit-Feature von TIBODatabase. Die im ersten Post zitierte Prozedur wird immer dann verwendet, wenn ein SQL-Statement (kann auch eine Abfrage sein) nur an einer Stelle benötigt wird und sich somit keine eigene Query etc. im DM lohnt. Momentan bekommen wir damit den Stand der DB von all dem, was mittels Query.Post bestätigt wurde. Dieses Verhalten darf sich nicht ändern. Leider habe ich keine umfassenden Kenntnisse von Datenbanken, um die Auswirkungen einer eigenen Transaktion umfänglich abschätzen zu können. Ich kann mir aber z.B. vorstellen, dass das die Ausführungsgeschwindigkeit (merklich???) und evtl. Sichtbarkeiten von Änderungen beeinflusst. Letzteres darf wie gesagt nicht sein. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
In allen meinen AdHoc-Abfragen habe ich immer dieses Konstrukt verwendet:
Delphi-Quellcode:
und bin damit einer frühen Empfehlung von Jason gefolgt. Im produktiven Einsatz seit 1998 ist bei mir der von Dir geschilderte Fehler nie aufgetreten.aQuery := TIB_Query.Create(nil); try with aQuery do begin sql.text:=Format(' select acc_profil from t_lms_account where nr=%d for update ',[lms.accountnr]); ib_Connection := dm.IB_TransactionDefault.IB_Connection; ib_transaction := dm.IB_TransactionDefault; open; Edit; FieldByName('acc_profil').AsString := aProfile.AsString; Post; end finally aQuery.free; end; Gleichwohl gibt es beim Einsatz von Firebird (meine Erfahrung bis V. 2.1) einige Fallstricke. Einer der Wesentlichen: Auf Server und Client muss immer die gleiche gds32.dll verwendet werden. Ich habe dazu diese Datei in das Programm-Verzeichnis gelegt, damit sie nicht durch andere Installationen überschrieben wird (da gab's mal z.B. eine populäre Telefon-CD). Damit sind einige "komische" Effekte aus der Anfangszeit verschwunden. Zur Transaktion: Es gibt keinen Perfortmance-Verlust, da jede SQL-Abfrage ohnehin in einer Transaktion abläuft. Benutzt Du Isolation = tiCommitted, solltest Du auch kein Problem mit der Sichtbarkeit haben. IBO verwendet verschieden Timer, um Deadlocks zu lösen. Ich denke, dass bei Dir dieser Fall auftritt. Man sollte z.B. in jedem Formular, eine eigene Transaktions-Komponente verwenden. Error-Handling: Habe ich zentral auf IB_Connection.OnError abgearbeitet und nicht pro Query. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
@neo4a:
Danke für den ausführlichen Post! Da sind einige Lösungsansätze enthalten, die ich ab Montag mal der Reihe nach abarbeiten werde. Zur Transaktion: Ich dachte an die Erstellung einer neuen Transaktion auf dem Server. Aber der Zeitbedarf dafür ist sicherlich wenn, dann nur im Hochleistungsbereich interessant.:wink: Zitat:
Zitat:
IB_Connection.OnError werde ich mir dann auch mal zu Gemüte führen. Jetzt wünsche ich allen erst mal ein schönes Woe, ich melde mich auf alle Fälle nächste Woche wieder, wenn es Neues gibt. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Ich habe die Versionen der gds32.dll überprüft. Hier alle Versionen der beteiligten Komponenten (falls was fehlt bitte nachfragen!):
Wir benutzen TIBODataBase.Isolation = tiCommitted und TIBODataBase.AutoCommit = True. Gibt es da irgendwelche bekannten Versionskonflikte? Bzgl. der Transactions steht in der Hilfe folgendes: Zitat:
Zitat:
Ich werde folgende Konstruktion ausprobieren, in der Hoffnung, dass der Vorschlag mit den IBO-Timern Erfolg bringt und der Konflikt intern in einem anderen IBO-Thread provoziert wird:
Delphi-Quellcode:
Query := TIBOQuery.Create(IB_Connection);
try Query.IB_Connection := IB_Connection; Query.KeyLinksAutoDefine := GetEditableSelectResult; Query.RequestLive := GetEditableSelectResult; Query.SQL.Append(SQL); try Query.Open; except on E:Exception do begin Log('Fehler beim Öffnen der Query'#13#13 + 'Fehlermeldung:'#13 + E.Message + #13#13 + 'Fehlerverursachendes SQL:'#13 + Query.SQL.CommaText); // Hoffen, dass sich das Aufhängen bei der Freigabe mittels WaitForMultipleObjects durch vorheriges Warten erledigt for i := 300 downto 0 do // sollte ein paar Sekunden entsprechen Sleep(0); // verwirft den Rest der Zeitscheibe raise; // Ausführung der Prozedur trotzdem abbrechen, Query freigeben end; end; try // Tue Was finally Query.Close; end; finally Query.Free; end; |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Server- und IBO-Version sind sehr alt. Ich kenne nicht Dein Budget, aber zumindest für den Server gibt es mit Firebird eine gute Alternative. Ich habe zu Zeiten von IBO 3.X mit Firebird 1.03 keine Probleme gehabt.
Das "Einfrieren" sieht mir - wie gesagt - ganz nach einem Deathlock aus. Du kannst dieses Verhalten recht leicht nachstellen, indem Du einen Datensatz mit einem SQL-Tool (z.B. IB_SQL) editierst und die Transaktion nicht beendest. Dann gehst Du mit Deiner App (sofern sie in dem Alter noch gehen kann) auf diesen Datensatz und tust, was Du tun willst. Überprüfe, ob da was einfriert. Kannst Du so das Verhalten Deiner App reproduzieren, dann kann man Lösungen suchen, alles andere ist Mutmaßung und führt eigentlich zu nichts. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Zitat:
Gehen wir mal davon aus, dass es sich tatsächlich um einen Bug in der DLL handelt. Wir setzen hier IBExpert ein. Dort gibt es eine gds32.dll von 2004 (Version 1.5.2.4731 für Firebird 1.5), die offenbar für die Verbindung zu unserem Interbase 6.1 verwendet wird, wenn ich die IBExpert-DB-Einstellungen richtig lese. Meinst du es ist eine gute Idee diese neuere dll testweise auf den Clients zu verwenden, auf denen unser Programm läuft? IBExpert läuft sehr stabil auf unserem IB 6.1 Server. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Zitat:
Wie gesagt, kannst Du den/die Fehler nicht nachstellen, sind alle Deine weiteren Versuche wie reines Voodoo: Du kannst nur hoffen, dass es hilft. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Hi,
Zitat:
Aber jede Menge Zeit so einen Fehler zu suchen ist vorhanden? Keine Angst, das soll jetzt kein Vorwurf sein, ich war selbst oft genug in dem Hamsterrad gefangen. Du musst relativ bald an den Punkt kommen wo Du das ganze stoppst und grundlegende Umbauten vornimmst. Die IB6-Firebird 1.5 Umstellung ist bei mir schon lange her, aber ich war der Meinung dass das noch relativ schmerzfrei geht, d.h. einfach IB deinstallieren FB installieren und gut ist (nicht vergessen die DB per Backup zwischen den Versionen zu verschieben). Wenn Du dann noch einen alternativen Server dafür nimmst, sollte der Zeitaufwand doch sehr überschaubar sein und wenn es nichts bringt kannst Du wieder auf IB6 zurück. Zitat:
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Zitat:
Update Die Abfrage funktioniert übrigens im Test erwartungsgemäß reibungslos, auch wenn ich mit einem anderen Tool eine offene Transaktion habe. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Mach doch einmal folgendes: Setze Dir eine VMWare-Umgebung auf mit mindestens 2 Instanzen. In einer VM-Instanz installieren Dir Dein Unix mit dem Interbase-Server. Ist auch eine schöne Übung für den Ernst-Not-Fehler-Fall. In der 2. VM- Instanz laufen so viele Clients wie möglich. Modifiziere Dein Client- Programm mit einem Timer mit Random-Intervall, der die unterschiedlichen Lookup-Queries permanent feuert. Überprüfe visuell oder programmtechnisch, ob die Clients nun einfrieren. Wenn das Einfrieren klappt: Gut, dann ist das Problem im Labor reproduzierbar. Wenn nicht, dann lasse Deine VM-Clients in einer Arbeitspause (arbeiten CallCenter auch nachts?) auf den realen Server los. Kommt es dann zum Einfrieren, dann liegts am IB-Server oder der Netzwerkumgebung (Switch, Firewall etc.). Die Virtualisierung kostet nichts als Arbeit und hilft Dir, Dein Szenario systematisch zu isolieren. Weniger Voodoo, mehr Ergebnisse. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Ich werde nächste oder übernächste Woche berichten, was bei dem Voodoo rausgekommen ist. |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Es deutet alles darauf hin, dass die gds32.dll von 2004 scheinbar funktioniert, dabei aber die Datenbankdatei zerschießt. Zum Glück habe ich sie nur mit der Testdatenbank benutzt...
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Kannst du eine Seite nennen, auf der diese Bugs aufgelistet sind? Wär sicher hilfreich die mal gelesen zu haben, wenn man damit arbeitet. :wink:
Wenn wir umsteigen, wollen wir auch von IBO weg. Delphi XE hat da wohl brauchbare Komponenten inzwischen. Das hat allerdings mein Kollege ausgekundschaftet, ich kann da noch nicht viel dazu sagen. Aber wenn, dann steigen wir gleich auf eine aktuelle Firebird um. Wenn dabei Probleme auftreten, dann poste ich hier wieder. :wink: |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
|
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
![]() und in weiterer Folge auch von 1.5: ![]() :thumb: |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Die Release Notes werde ich mir am Montag auf Arbeit mal zu Gemüte führen. Wenn sie nicht wieder mal noch schnell eine Bestellmaske brauchen, weil jemand gemerkt hat, dass man ohne Maske keine Bestellungen bearbeiten kann. Aber das war ja heute erst der Fall... |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Zitat:
Also fange endlich einmal an, Dir ein transportables Backup Deiner DB anzulegen, dass Du in eine Firebird-Versionen ab 1.0.3 importieren kannst (Tipp: backup/restore als Batch, FB-Server unter virtualisiertem Windows-OS ab WinXP). Gegen diese Firebird-DB solltest Du Dein Programm ohne Probleme fahren können, indem Du die gds32.dll der Server-Version auch am Client benutzt. Du musst dazu kein Client-Setup machen; es reicht die gds32.dll im Programmverzeichnis. Dieser Aufbau ist Dir ja nicht nur bei Deinem aktuellem Problem nützlich, sondern auch bei Deiner laufenden Entwicklung, denn Du programmierst doch nicht wirklich gegen die Produktions-DB, oder?! |
AW: Programm friert bei Open ein -> Fehler in gds32.dll
Da wir für das Programm auch Eingangsdaten aus der DB lesen, haben wir eine Test-DB im Netz, mit der alle 3 Programmierer arbeiten und die vom Datenmanagement mit Testdaten gefüllt wird.
Was ich vielmehr mit meinem letzten Post erklären wollte, ist die Ursache des Zeitmangels, der mich dazu gebracht hat, das ursprüngliche Problem dieses Threads zu ignorieren, weil es wesentlich wichtigere Probleme bei uns gibt. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:47 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