Entwickler-Ecke
Datenbanken - Speicherleck Firebird / ZEOS über IdHTTPServer Thread
Hendrik - Mi 25.03.15 17:11
Titel: Speicherleck Firebird / ZEOS über IdHTTPServer Thread
Hallo zusammen,
für einen Webzugriff auf eine Firebirddatenbank habe ich einen Windows-Dienst entwickelt, der über einen IdHTTPServer die abgefragten Informationen bereitstellt.
Bei einem Seitenaufruf über IdHttpServerCommandGet wird in einer eigenen function zunächste eine ZConnection erstellt, diese mit der Datenbank verbunden, eine ZQuery erstellt, die die SQL Abfrage öffnet und aus der sich die Daten der Webseite ergeben. Anschließend gebe ich die Connection und die Query wieder frei.
Das funktioniert soweit auch ohne Probleme.
Allerdings steigt der verbrauchte Arbeitsspeicher sowohl des Firebirdservers als auch meines Dienstes kontinuierlich an, wobei der Speicherverbrauch des Firebirdserver stärker ansteigt. Auf meinem Demosystem läuft das Ganze dann, bis die Speicherauslastung bei 99% ist und dann auf Grund fehlendem Arbeitsspeicher nichts mehr geht.
Es wirkt auf mich so, als ob die Connections trotz der Freigabe über ZConnection.free; nicht wirklich freigegeben werden.
Habt ihr dazu eine Idee oder einen Rat?
Nersgatt - Mi 25.03.15 17:14
Bei solchen komischen Verhalten ist für mich die erste Aktion immer, in der dpr ReportMemoryLeaksOnShutdown := True zu setzen. Meist gibt das schon gute Hinweise, in welche Richtung man suchen muss.
Den Dienst würde ich so umschreiben, dass Du ihn auch Optional als normale Anwendung laufen lassen kannst. Das ist fürs Debugging etwas handlicher, als ein Dienst.
Hendrik - Mi 25.03.15 21:32
Danke für die Antwort. Ich nutze leider noch Delphi 6 - da scheint das noch nicht unterstützt zu sein, wenn ich es richtig sehe oder?
Nersgatt - Do 26.03.15 07:32
Da musst Du Dir fastmm installieren:
http://sourceforge.net/projects/fastmm/
Das sollte auch mit Delphi 6 funktionieren. Und damit hast Du sogar noch mehr Möglichkeiten (Stichwort FullDebugMode). Aber fang dann erst mal mit der Zeile an, die ich Dir genannt hab. Meist kommt man damit schon gut weiter.
Lemmy - Do 26.03.15 10:05
Hendrik hat folgendes geschrieben : |
Es wirkt auf mich so, als ob die Connections trotz der Freigabe über ZConnection.free; nicht wirklich freigegeben werden.
|
gibst Du die Connection "nur" frei oder schließt Du die Verbindung vorher explizit? Was ist mit den Transaktionen? Welche Version von Firebird setzt du ein? Ab 2.0/2.1 gibt es Monitoringtabellen, darunter die mon$transactions. Hier kannst Du schauen welche aktiven Transaktionen gerade auf der Datenbank sind - werden es da nicht weniger nach Anfragen auf den Server stimmt was mit dem Beenden der Transaktionen nicht. D.h. hier wäre vermutlich die bessere Variante auf manuelle Transaktionssteuerung umzusteigen...
Grüße
Hendrik - Do 26.03.15 17:28
Vielen Dank für den Hinweis Lemmy. Hier scheint tatsächlich das Problem zu liegen. In der mon$transactions waren weit über 400 Transactions aktiv und es werden immer mehr.
Ich gebe die ZQuerys wie folgt frei:
Quelltext
1: 2:
| ZQuery.close; ZQuery.free; |
Und bei den Connections
Quelltext
1: 2:
| ZConnection.disconnect; ZConnection.free; |
Würdest du hier etwas anders machen?
Lemmy - Do 26.03.15 18:59
Kennt Zeos Transactions? Schau mal ob es bei den Connections irgend eine DefaultTransaction gibt. Die solltest Du vor dem Connection.Close per Transaction.Commit; abschließen.
Hendrik - Do 26.03.15 19:13
Ich habe nochmal weiter getestet. Das Problem tritt nur auf, wenn zu einem Zeitpunkt mehrere Threads mit einer Connection aktiv sind.
Bei nur einem Zugriff zu einer Zeit steigt die Anzahl der Transactions nicht an, schicke ich mehrere Anfragen parallel, so entsteht das Problem.
Bei der ZConnection habe ich nichts gefunden, das einen direkten Zugriff auf die Transaction zulässt. (Mit ZConnection.commit bzw. rollback habe ich es auch mit gleichem Ergebnis getestet).
Hendrik - So 29.03.15 16:54
Falls nochmal jemand das Problem hat: Ich habe das Projekt auf D XE5 mit Firedac portiert. Dort läuft alles zufriedenstellend.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!