Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Firedac: Öffnen einer ADS-DB dauert ewig (https://www.delphipraxis.net/211524-firedac-oeffnen-einer-ads-db-dauert-ewig.html)

oltrop 28. Sep 2022 12:02

Datenbank: Advantage Database • Version: 12 • Zugriff über: Firedac

Firedac: Öffnen einer ADS-DB dauert ewig
 
Hallo Zusammen,

ich arbeite hauptsächlich mit Delphi XE und bin jetzt bei Delphi 11 gelandet.
Ich möchte eine ADS-Tabele (Advantage Database Server) mit Firedac öffnen.

Nach dem Öffnen läuft die Eieruhr eine Ewigkeit. Ist die Tabelle zu groß,
kommt auch ein Memory-Fehler. Eigentlich soll er einfach, wie früher, die DB
öffnen und z.B. in einem DBGrid die ersten Zeilen anzeigen.

Wie muss ich das machen?

Da wir demnächst auf eine PostgreSQL-DB umstellen bin ich etwas am testen.
Ich habe 2 FDConnection Objekte (Eine für ADS und eine für PG)
Verbinde ich nun meine TFDTable zuerst mit der PG Datenbank. Wird diese
schnell geöffnet. Verbinde ich danach die ADS mit der FDTable, wird
diese auch ruckzuck geöffnet.

Öffne ich zuerst die ADS, dauert es ewig.

Ich habe euch hier mal den Code mit gepostet. Dann wird es vielleicht etwas deutlicher

Delphi-Quellcode:
  // checked = ADS benutzen, sonst PostgreSQL
  if checkBox1.Checked then
  begin
   // vor ADS, erstmal PostgreSQL öffnen
   // So funktioniert das öffnen der ADS zügig
   // Lasse ich diese If-Struktur weg,
   // liest er sich die komplette ADS-Tabelle ein.
   if DM1.FDTAdressen.Connection = NIL then
   begin
     DM1.FDTAdressen.Close;
     DMStart.FDConADS.Connected := False;
     DMStart.FDConPG.Connected := True;
     DM1.FDTAdressen.Connection := DMStart.FDConPG;
     DM1.FDTAdressen.TableName := 'v2ad1001';
     DM1.FDTAdressen.Open;
   end;
   // jetzt ADS öffnen
   DM1.FDTAdressen.Close;
   DMStart.FDConPG.Connected := False;
   DMStart.FDConADS.Connected := True;
   DM1.FDTAdressen.Connection := DMStart.FDConADS;
   DM1.FDTAdressen.TableName := 'Adressen\V2AD1001';
   DM1.FDTAdressen.Open;
  end
  else begin
   // PostgreSQL öffnen
   DM1.FDTAdressen.Close;
   DMStart.FDConADS.Connected := False;
   DMStart.FDConPG.Connected := True;
   DM1.FDTAdressen.Connection := DMStart.FDConPG;
   DM1.FDTAdressen.TableName := 'v2ad1001';
   DM1.FDTAdressen.Open;
  end;

Der schöne Günther 28. Sep 2022 12:17

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Du hast doch einen Debugger. Was genau dauert ewig? Das
Delphi-Quellcode:
DM1.FDTAdressen.Open()
?

Oder halte doch mal mittendrin mit dem Debugger an, dann siehst du, was er grade macht.

himitsu 28. Sep 2022 12:20

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Mal mit einem Profiler schauen, wo es hängt?

Zitat:

eine Ewigkeit. Ist die Tabelle zu groß
...
die ersten Zeilen anzeigen
Warum alle Daten laden?

Lade nur das, was du brauchst. (SELECT mit WHERE anstat die ganze TABLE)
Und Firedac sollte in den FetchOptions bereits was bieten, also wo es selbstständig nur das lädt, was aktuell nötig ist.
(natürlich sollte das verwendete Grid auch soeinen Modus unterstüzen)

joachimd 28. Sep 2022 13:05

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Leider arbeitet FireDAC in diesem Fall nicht wie die ADS Komponenten, da es keinen direkten ISAM-mode gibt. Wie bereits genannt: FetchOptions anschauen.
https://docwiki.embarcadero.com/RADS...tzen_(FireDAC)
speziell FetchOptions.CursorKind auf ckAutomatic, FetchOptions.Mode auf fmOnDemand sollten Besserung bringen.

oltrop 28. Sep 2022 13:09

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Erstmal vielen Dank für die Antworten.
Ich weiß schon was da los ist. Er versucht die komplette Tabelle in den Speicher zu laden.


Ich schaue mir die Optionen

"FetchOptions.CursorKind auf ckAutomatic, FetchOptions.Mode auf fmOnDemand"

an und melde mich nochmal!

oltrop 29. Sep 2022 14:36

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
So, hab mir nochmal dank eurem Tipp die Doku angeschaut.

Eingestellt habe ich jetzt:

Minimale Verzögerung beim Öffnen der Abfrage.
CursorKind = ckDynamic
Mode = fmOnDemand RowsetSize = 50 Schließen Sie fiMeta aus Items aus.

Das hat jetzt geklappt.

Vielen Dank euch allen! :-D

Frickler 30. Sep 2022 11:20

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Genau an dem Punkt sind wir auch aktuell bei einem Projekt. Dazu haben wir das FireDAC-Buch von Cary Jensen besorgt, welches sehr hilfreich ist.

oltrop 30. Sep 2022 12:46

AW: Firedac: Öffnen einer ADS-DB dauert ewig
 
Danke für den Tipp:thumb:!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:09 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz