Autor Beitrag
Hendrik
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: Mi 25.03.15 17:11 
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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Hendrik Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1581
Erhaltene Danke: 279


Delphi 10 Seattle Prof.
BeitragVerfasst: Do 26.03.15 07:32 
Da musst Du Dir fastmm installieren: 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.

_________________
Gruß, Jens
Zuerst ignorieren sie dich, dann lachen sie über dich, dann bekämpfen sie dich und dann gewinnst du. (Mahatma Gandhi)
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: Do 26.03.15 10:05 
user profile iconHendrik hat folgendes geschrieben Zum zitierten Posting springen:

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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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:
ausblenden Quelltext
1:
2:
ZQuery.close;
ZQuery.free;


Und bei den Connections
ausblenden Quelltext
1:
2:
ZConnection.disconnect;
ZConnection.free;


Würdest du hier etwas anders machen?
Lemmy
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 792
Erhaltene Danke: 49

Windows 7 / 10; CentOS 7; LinuxMint
Delphi 7-XE10.1, VS 2015
BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 324



BeitragVerfasst: 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.