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

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

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

Beitrag von kralle »

Moin,

aktuell habe ich zum Trennen der Datenbank-Verbindung einen Button mit diesem Code:

Code: Alles auswählen

procedure TForm1.Button_Verbindungen_trennenClick(Sender: TObject);
begin
     // Online-Verbindung trennen
     If MySQL57Connection1.Connected then
     begin
       MySQL57Connection1.close;
       MySQL57Connection1.free;
     end;
     //
     // XAMPP-Verbindung trennen
     If MySQL80Connection1.Connected then
     begin
       MySQL80Connection1.close;
       MySQL80Connection1.free;
     end;
end;        
Nur beim Trennen der Verbindung gibt es diese Fehlermeldung:

Code: Alles auswählen

Projekt project1 hat Exception-Klasse »External: SIGSEGV« ausgelöst.

 Bei Adresse 42906A

Code: Alles auswählen

000000000042906A 483B37                   cmp rsi,[rdi]
Das sagt mir jetzt echt nicht viel ...

Gruß Heiko
Zuletzt geändert von kralle am Di 21. Nov 2023, 20:13, insgesamt 1-mal geändert.
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

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

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von theo »

kralle hat geschrieben:
Mo 20. Nov 2023, 19:26
Das sagt mir jetzt echt nicht viel ...
Mir auch nicht. :wink:
Wurden denn beide Connections created?
Wenn ja, warum?

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: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von MmVisual »

FreeAndNil()

.Free reicht unter Linux nicht.
EleLa - Elektronik Lagerverwaltung - www.elela.de

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 6217
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Burgenland
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von af0815 »

Hast du du die Verbindung mit create erzeugt ? Wenn nein, keine free verwenden. Wenn du mit free arbeitest, dann zuerst die mit der Connection verbundenen Komponenten die Verbindung auf nil setzen.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von kralle »

Hmm, das liest sich für mich, als wenn ich schon beim Verbindungsaufbau (z.Z. ohne Try ...) schon was falsch mache.

So sieht die Verbindung zum lokalen XAMPP aus:

Code: Alles auswählen

procedure TForm1.Button_Verbinden_XAMPPClick(Sender: TObject);
begin
      // Parameter
     // ===========================================================================
     MySQL80Connection1.CharSet:='utf8mb4';
     MySQL80Connection1.DatabaseName:= 'usr_web46_9';
     MySQL80Connection1.HostName:= '127.0.0.1';
     MySQL80Connection1.Port:= 3306;
     MySQL80Connection1.UserName:= 'root';
     MySQL80Connection1.Password:='';
     MySQL80Connection1.Params.Text:='Port=3306';
     MySQL80Connection1.SkipLibraryVersionCheck:= False;
     // ===========================================================================
     DBGrid1.DataSource:= DataSource1;
     // Spaltenbreite automatisch aktivieren
     // Memo-Feldinhalt als Text anzeigen
        DBGrid1.Options := DBGrid1.Options + [dgAutoSizeColumns]+ [dgDisplayMemoText];
     // ===========================================================================
     SQLTransaction1.Database:= MySQL80Connection1;
     SQLTransaction1.Active:= true;
     // ===========================================================================
     SQLQuery1.Database:= MySQL80Connection1;
     //  Ermittelt die Anzahl der Einträge in der Tabelle
     SQLQuery1.Close;;
     SQLQuery1.SQL.Text:='SELECT COUNT(*) FROM jos311_jdownloads_files_backup_3_2_69;';
     SQLQuery1.Open;
     // ShowMessage(SQLQuery1.Fields[0].AsString); // Shows "105"
     SQLQuery1.Close;
     //
     SQLQuery1.SQL.Text:='SELECT * FROM jos311_jdownloads_files_backup_3_2_69;';
     SQLQuery1.Active:= true;
     Form1.Caption:='MariaDB-Zugriffstest - XAMPP-Verbindung';
end;

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Sieben
Beiträge: 202
Registriert: Mo 24. Aug 2020, 14:16
OS, Lazarus, FPC: Ubuntu Xenial 32, Lazarus 2.2.0, FPC 3.2.2
CPU-Target: i386

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von Sieben »

Hmm, für mich liest sich das doch deutlich eher so, wie einige hier schon vermutet haben: dass du versuchst, Objekte, die du aus der Palette auf ein Form oder Datenmodul gezogen hast - wofür ua auch ihre Standard-Benamsung spricht - mit Free freizugeben. Dementsprechend enthält dein Verbindungsaufbau auch kein Create dieser Objekte - sie sind 'schon da' und das Form bzw Datenmodul ist für die Freigabe zuständig. Kommentier doch einfach mal die beiden Zeilen mit .Free in deiner Trennungsroutine aus.

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von kralle »

Moin,
Sieben hat geschrieben:
Di 21. Nov 2023, 19:34
Kommentier doch einfach mal die beiden Zeilen mit .Free in deiner Trennungsroutine aus.
Jupp, ohne die beiden Zeilen klappt es. Danke.
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von kralle »

Moin,
theo hat geschrieben:
Mo 20. Nov 2023, 19:50
Wurden denn beide Connections created?
Wenn ja, warum?
Weil man einfach Sachen zusammen kopiert hat. Ohne ".Free" klappt es.

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Benutzeravatar
kralle
Lazarusforum e. V.
Beiträge: 994
Registriert: Mi 17. Mär 2010, 14:50
OS, Lazarus, FPC: Linux Mint 20 , FPC 3.3.1 , Lazarus 2.1.0 -Win10 & XE7Pro
CPU-Target: 64Bit
Wohnort: Bremerhaven
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von kralle »

Moin,
MmVisual hat geschrieben:
Di 21. Nov 2023, 08:22
FreeAndNil()

.Free reicht unter Linux nicht.
Brauche in diesem Fall beides nicht.
Da kann man sich natürlich fragen, warum weiß Lazarus und/oder der Compiler nicht, das er bei Linux aus einem Free ein FreeAndNil() machen muss?

Gruß Heiko
OS: Manjaro Linux, Debian und Windows 10
FPC-Version: 3.2.2 , Lazarus 3.0
+ Delphi XE7SP1

Benutzeravatar
m.fuchs
Lazarusforum e. V.
Beiträge: 2641
Registriert: Fr 22. Sep 2006, 19:32
OS, Lazarus, FPC: Winux (Lazarus 2.0.10, FPC 3.2.0)
CPU-Target: x86, x64, arm
Wohnort: Berlin
Kontaktdaten:

Re: Wie trennt man eine Datenbank-Verbindung richtig?

Beitrag von m.fuchs »

MmVisual hat geschrieben:
Di 21. Nov 2023, 08:22
FreeAndNil()
.Free reicht unter Linux nicht.
Warum?
Software, Bibliotheken, Vorträge und mehr: https://www.ypa-software.de

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 »

Wenn man von Hand irgend eine Komponente mit Create erzeugt und diese mit .Free frei gibt, dann wird unter Windows auch der Speicher wieder frei gegeben, unter Linux nicht und beim beenden der Exe unter Linux zeigt die Console diverse Speicherlecks. Wenn man FreeAndNil() unter Linux nutzt dann sind diese Speicherlecks weg.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

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

Beitrag von theo »

MmVisual hat geschrieben:
Di 21. Nov 2023, 21:38
Wenn man von Hand irgend eine Komponente mit Create erzeugt und diese mit .Free frei gibt, dann wird unter Windows auch der Speicher wieder frei gegeben, unter Linux nicht und beim beenden der Exe unter Linux zeigt die Console diverse Speicherlecks. Wenn man FreeAndNil() unter Linux nutzt dann sind diese Speicherlecks weg.
Wo hast du den diese Weisheit her?
Da müsste ich ja tausende Lecks haben?

Code: Alles auswählen

procedure TForm1.FormCreate(Sender: TObject);
begin
   fABtn:=TButton.create(nil);
end;

procedure TForm1.FormDestroy(Sender: TObject);
begin
   fABtn.free;
end;  
Heap dump by heaptrc unit of /home/theo/lazarus/fpcupdeluxe/projects/project1
836 memory blocks allocated : 1549207/1550120
836 memory blocks freed : 1549207/1550120
0 unfreed memory blocks : 0
True heap size : 1605632
True free heap : 1605632
Das Nil setzen ist nur für eine nachfolgende Assigned (Nil) Prüfung von Bedeutung.
Mit Lecks hat das nichts zu tun, soweit ich weiss

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 »

Wegen einem einzigen Button passiert in der Tat noch nichts.
Meine EXE hat über 100000 Codezeilen und jede Menge Create von irgend welchen Sachen drin.
Da kam es dann zu diesen Problemen. Erst mit FreeAndNil war es dann weg.
Definitiv ist Linux da nicht so sauber wie Windows. Man merkt das erst wenn man zufällig die EXE von der Konsole aus öffnet, wenn man die per Link vom Desktop aus startet sieht man nichts.
EleLa - Elektronik Lagerverwaltung - www.elela.de

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

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

Beitrag von theo »

Habe ich noch nie gehört und das ist mir auch noch nie begegnet.
Hast du irgendwelche Quellen und Hintergründe dazu oder ist das einfach dein persönlicher Eindruck?
Ich kann mir nicht recht vorstellen, dass man davon nichts weiss, falls es denn zutrifft.

Benutzeravatar
corpsman
Lazarusforum e. V.
Beiträge: 1498
Registriert: Sa 28. Feb 2009, 08:54
OS, Lazarus, FPC: Linux Mint Mate, Lazarus GIT Head, FPC 3.0
CPU-Target: 64Bit
Wohnort: Stuttgart
Kontaktdaten:

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

Beitrag von corpsman »

@MmVisual
Ich finde deine These auch recht Steil. Ich entwickle und "Lebe" unter Linux. Meine Programme sind auch gern mal etwas Länger. CCM zum Beispiel hat auch knapp 50000 Zeilen Code, jede Menge Datenbanken, Open GL und was nicht noch alles. Ich nutze das FreeAndNil so gut wie nie (schande über mich), immer nur ein .free und hab auch keine Speicherlöcher..
--
Just try it

Antworten