Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   MyDac Table mit Open und FetchAll (https://www.delphipraxis.net/216837-mydac-table-mit-open-und-fetchall.html)

Edelfix 11. Mär 2025 12:32

Datenbank: MariaDB • Version: 10.5.11 • Zugriff über: MyDac

MyDac Table mit Open und FetchAll
 
Hallo,
es geht sich um folgendes Problem. Ich habe in einer MariaDB Tabelle sehr viele Datensätze.
Der Open Befehl von der TMyTable Komponente braucht 6 Sekunden bis Daten angezeigt werden. Deswegen habe ich die Option FetchAll auf false gestellt.
So weit so gut.

Wenn ich jetzt aber mit Close die Table schließen möchte kommt jedes Mal eine Exception.
Exception-Klasse EMySqlException mit Meldung 'Lost connection to MySQL server during query'.

Wie schließe ich die Table ohne eine Exception zu bekommen?

Edelfix 11. Mär 2025 15:00

AW: MyDac Table mit Open und FetchAll
 
Ist wahrscheinlich ein Defekt in der Komponente. Habe bei Devart ein Ticket erstellt.

blawen 12. Mär 2025 07:40

AW: MyDac Table mit Open und FetchAll
 
Kann es sein, dass dazwischen zuviel Zeit vergeht (Timeout)? Falls ja, würde ich all paar Minuten mit einer zweiten Querry eine Refresh Abfrage starten.

Edelfix 12. Mär 2025 09:25

AW: MyDac Table mit Open und FetchAll
 
Es hat etwas mit der Menge der daten zu tun. Wenn ich eine Tabelle mit 6.000 Datensätzen nehme dann kommt keine Fehlermeldung bei Close.

Eine Tabelle mit 500.000 Datensätzen macht Probleme.

Der Testaufbau ist simpel. Ich klicke "Open" dann werden sofort Daten im DBGrid angezeigt.
Wenn ich dann "Close" klicke kommt die Fehlermeldung. Auch wenn ich 10 Sekunden warte.

Delphi-Quellcode:
unit Unit3;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Vcl.Grids, Vcl.DBGrids, MemDS,
  DBAccess, MyAccess, Vcl.StdCtrls;

type
  TForm3 = class(TForm)
    btnOpen: TButton;
    MyConnection1: TMyConnection;
    MyTable1: TMyTable;
    DataSource1: TDataSource;
    DBGrid1: TDBGrid;
    btnClose: TButton;
    cbFetchAll: TCheckBox;
    cobTableNames: TComboBox;
    procedure btnOpenClick(Sender: TObject);
    procedure btnCloseClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form3: TForm3;

implementation

{$R *.dfm}

procedure TForm3.btnOpenClick(Sender: TObject);
begin
  MyTable1.TableName := cobTableNames.Text;
  //--
  if NOT cbFetchAll.Checked then
    MyTable1.FetchAll := false;
  //--
  MyTable1.Open;
end;

procedure TForm3.btnCloseClick(Sender: TObject);
begin
  MyTable1.Close;
end;

end.

Edelfix 12. Mär 2025 16:02

AW: MyDac Table mit Open und FetchAll
 
Habe noch keine Antwort von Devart bekommen. Sind erst zwei Tage rum.

Um die Zeit zu nutzen habe ich jetzt UniDac Trial ausprobiert. Das funktioniert ohne Fehlermeldung.

Dafür hat die UniDac Komponente keine "FetchAll" Property sondern "SmartFetch". Erst ein mal vielversprechend.

Nur ist es so das die Daten zwar schnell sichtbar sind aber wenn ich ein "SetRange" oder Filter setze mir die Anwendung einfriert.

Ich komme nicht dahinter wie Devart sich die Verarbeitung von vielen Datensätzen mit einer Table Komponente gedacht hat.
Mir ist auch aufgefallen das es schlagartig langsamer wird ab etwa 400.000 Datensätzen.

himitsu 12. Mär 2025 17:39

AW: MyDac Table mit Open und FetchAll
 
Die 6000 Datensätze passen vermutlich noch in die Range rein und werden sofort geladen.
Konnte man nicht irgendwo einstellen, wie groß der Bereich ist, welcher beim Fetching geladen werden soll?

Edelfix 13. Mär 2025 08:18

AW: MyDac Table mit Open und FetchAll
 
Ja. Mit "FetchRows". Steht noch auf Standard Wert 25. Aber auf welchen Wert stelle ich das?
Die Tabelle mit 500.000 Datensätzen ist nicht die größte. Wir haben auch 2,5 Millionen und mehr.

Jetzt ist die Antwort von Devart da.

Please be advised that when FetchAll = False, the "Lost connection" error occurs only during debugging via IDE, this is normal behavior and does not affect the operation of the application itself.

Nutzt jemand MyDac? Ist MyDac nur für kleine Projekte gedacht?

So geht das nicht. Bei jedem refresch und close muss ich die Exception weg klicken. Das ist doch nicht normal.

Bernhard Geyer 13. Mär 2025 10:06

AW: MyDac Table mit Open und FetchAll
 
AFAIK hat MySQL (und damit MariaDB als "ableitung" davon) keine Serverseitigen Curser (außer es wurde mittlerweile implementiert)

D.h. das was DevArt hier macht ist ein "Trick" das man einfach die Abfrage der Daten stoppt und damit den Server hier (u.U. sehr) belastet, wenn er hier eine Auslieferung von Daten sehr lange aufrecht erhalten muss.

Wir hatten solche Serverseitigen Curser früher auch genutzt.
Mittlerweile haben das wir das komplett umgebaut mit
- Begrenzung das immer nur maximal x Datensätze für "Plain-Grid"-Darstellungen geholt werden
- Abfrage der Daten über Primärschlüssel. Und erst wenn der Datensatz in den sichtbaren Bereich des Grid kommt, wird der Rest geladen.

Wenn du nach "Server vs client cursor" suchst, solltes du einige Diskussionen zu dem Thema finden.

dataspider 13. Mär 2025 10:44

AW: MyDac Table mit Open und FetchAll
 
Zitat:

Zitat von Edelfix (Beitrag 1547029)

Dafür hat die UniDac Komponente keine "FetchAll" Property sondern "SmartFetch".

Bei UniDac ist das alles unter SpecificOptions zu finden, auch FetchAll...

Frank

Edelfix 13. Mär 2025 14:47

AW: MyDac Table mit Open und FetchAll
 
Meine Aufgabe ist es ein Ersatz für ADS (Advantage Database Server) Komponenten zu finden. Da sie seit etwa 10 Jahre keine Updates bekommen.
Dabei bin ich auf MariaDB gekommen. Unsere Webseiten Abteilung hat damit Erfahrung.

Wenn ADS einen Datenbank Curser hat aber MariaDB nicht dann ist Wahl der neuen Datenbank wohl nicht so glücklich.

Welche Datenbank ist der ADS ähnlicher?

Es geht um ein uraltes und riesiges Projekt. Das auf ein anderes Verhalten um zu biegen ist zu viel Aufwand.

Einer der großen Hindernisse ist die Tatsache das aus irgendeinem Grund nicht mit Master/Detail gearbeitet wurde sondern mit "SetRange". An über 800 Stellen.

Nachtrag:
Ich glaube ich habe es falsch verstanden. Die MariaDB kann beides. Aber nicht beides gleichzeitig.


Alle Zeitangaben in WEZ +1. Es ist jetzt 11:14 Uhr.
Seite 1 von 2  1 2      

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