[gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von MmVisual »

Ich selbst arbeite hautpsächlich unter WIndows und übersetze nur unter Linux für die Linux User. Einmal, vor ein paar Jahren hatte sich einer beklagt dass da so viele Meldungen beim Beenden in der Konsole erscheinen, dann habe ich mich darum gekümmert die Speicherlecks zu beheben. Den ein oder anderen fehlenden Free hatte ich dann auch gefunden, jedoch gingen die meisten erst mit FreeAndNil weg.
Bei welchen Objekten das jetzt konkret war weis ich nicht mehr. Ich vermute mal TStringList oder TZQuery, die erzeuge ich sehr oft dynamisch für kleine Abfragen zwischendruch.

Irgendwo darüber gelesen habe ich nicht, es ist meine persönliche Erfahrung.
Ich bin mir jetzt auch nicht sicher welches Linux das war, entweder Suse oder Debian in der VBox.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von theo »

@MmVisual:
Könntest du mal eine Demo hochladen, welche das Problem zeigt?
Könntest du erklären, warum nicht "Free" sondern erst das Nil setzen der Variablen den Speicher frei geben soll?
Mir ist das alles sehr unklar.
Deine Behauptung würde ja auf ein fundamentales, inakzeptables Problem hinweisen.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von MmVisual »

So schnell kann ich das Demo leider nicht bauen, Ich habe gerde zu viel Arbeit.
Ich muss auch erst mal noch ein Demo wegen einem Zeos Bug schreiben, da gibt es recht häufig gulsch in den Strings die in die DB geschrieben werden sobald man ein ° Zeichen im String hat. z.B. "°C/°F"
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von fliegermichl »

Das ist definitiv nicht so, daß FreeAndNil nötig ist.
Aber

Code: Alles auswählen

procedure TForm1.Button1Click(Sender : TObject);
var
 mc : TMyClass;
begin
 mc := TMyClass.Create;
 mc.MachWasSchoenes;
 mc.Free;
 if mc <> nil then mc.MachwasSchoenes; // < Hier kracht es weil mc noch immer auf den Speicherbereich zeigt wo vorher die Instanz von TMyClass war.
end;
Letzenendes macht FreeAndNil(mc) nichts anderes als

Code: Alles auswählen

 mc.Free;
 mc := nil;
und dadurch würde der nachfolgende Vergleich if mc <> nil nicht dazu führen, daß mc.machwasschoenes aufgerufen wird.

wp_xyz
Beiträge: 4893
Registriert: Fr 8. Apr 2011, 09:01

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von wp_xyz »

Es gibt immer wieder Diskussionen über FreeAndNil. Im wesentlichen kann man die Meinungen in zwei Gruppen einteilen: "FreeAndNil ist die Rettung vor Abstürzen" und "FreeAndNil ist schädlich, weil es Fehler verschleiert". Während du zur ersten Gruppe gehörst, würden die Anhänger der zweiten Gruppe sagen: Du greifst auf einen bereits freigegebenen Speicherberich zu. Dadurch dass du den Zeiger darauf auf nil setzen musst, verhinderst du den Absturz - aber der eigentliche Fehler, der Zugriff auf den nicht mehr vorhandenen Speicherbereich, ist schon passiert. Etwas ist an der Struktur deines Programms falsch, dass du überhaupt auf diesen Speicher zugreifst.

MmVisual
Beiträge: 1470
Registriert: Fr 10. Okt 2008, 23:54
OS, Lazarus, FPC: Winuxarm (L 3.0 FPC 3.2)
CPU-Target: 32/64Bit

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von MmVisual »

In meinem Programm gibt es in der Tat einige Dinge, die erzeuge ich zur Laufzeit wenn ich diese zum ersten mal benötigt (z.B Form mit Progressbar für eine Warteanzeige).
Bei Destroy wird überprüft ob diese Form da ist (If Assigned() Then ...Free) und ggf. aufgeräumt.
Es wird zu Anfang nicht alles komplett geladen, um die Wartezeit zu verkürzen. Die einzelnen Dinge erst dann nach zu laden (und die ein oder andere Sekunde dann zu Warten) schmerzt weniger als wie wenn man zu Programmstart statt 1 Sekunde dann 5 Sekunden warten muss,

Es ist somit duchraus möglich dass ich in einder der beiden Gruppen gesteckt werden kann.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von theo »

Über den Gebrauch von FreeAndNil kann man sicher streiten, mich interessiert aber folgende Aussage, die sich ja auf ein Betriebssystem bezieht:
MmVisual hat geschrieben:
Di 21. Nov 2023, 08:22
FreeAndNil()

.Free reicht unter Linux nicht.
Ist das was dran, oder ist das Quatsch?

Benutzeravatar
fliegermichl
Lazarusforum e. V.
Beiträge: 1436
Registriert: Do 9. Jun 2011, 09:42
OS, Lazarus, FPC: Lazarus Fixes FPC Stable
CPU-Target: 32/64Bit
Wohnort: Echzell

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von fliegermichl »

Ich halte es für Quatsch. Free gibt den Speicher frei und FreeAndNil macht das auch und setzt die entsprechende Variable auf nil. Das ist bei allen Bestriebssystemen gleich.

Benutzeravatar
theo
Beiträge: 10499
Registriert: Mo 11. Sep 2006, 19:01

Re: [gelöst] Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von theo »

fliegermichl hat geschrieben:
Mi 22. Nov 2023, 16:12
Ich halte es für Quatsch. Free gibt den Speicher frei und FreeAndNil macht das auch und setzt die entsprechende Variable auf nil. Das ist bei allen Betriebssystemen gleich.
Das denke ich eigentlich auch.
Aber wenn jemand das Problem nachvollziehbar aufzeigen kann, bin ich immer noch interessiert.

Antworten