Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi [OOP] Wie viele Daten aus der DB laden? (https://www.delphipraxis.net/146294-%5Boop%5D-wie-viele-daten-aus-der-db-laden.html)

TheMiller 17. Jan 2010 12:16


[OOP] Wie viele Daten aus der DB laden?
 
Hallo,

ist vielleicht ein blöder Titel, aber mir fällt nichts besseres als Titel ein - kann ihn aber später gerne ändern.

Ich habe eine Frage bezüglich dem Laden von Daten aus der Datenbank und der Speicherung in Objekte. Also, stellt euch vor, ich möchte Artikel aus einer Datenbank laden und in einer TreeView anzeigen. Ein Artikel enthält die Felder "ArtikelID (Int), OrdnerId(int), Titel (VarChar), ArtikelText(Blob/Text), ErstelltAm(int) ...."

So, jetzt lade ich also alle Artikel aus der Datenbank, erstelle Objekte und zeige sie in einer TreeView an. So kann momentan nur die ArtikelID (in TreeView.Data) und der Titel (in der Item-Caption) verwendet bzw. angezeigt werden. Alle anderen Daten werden erst angezeigt, wenn man den Artikel öffnet.

Die Frage ist jetzt, ob ich trotzdem gleich alle Daten aus der DB laden soll, oder ob ich mir erst bestimmte Felder ausgeben lassen und die anderen bei Bedarf nachladen soll. Immerhin würde es bestimmt einiges an Arbeitsspeicher verbrauchen, immer alle Daten abzufragen. Andererseits ist es auch mehr Arbeit, die Daten nachzuladen.

Hier mal mein "Nachlade-Modell"

Delphi-Quellcode:
procedure TJKDB.Read(DataObj: TObject; Teaser: Boolean = False);
begin
  if (DataObj) is TArticle then
  begin
    if (DataObj) is TKomCategory then
  begin
    SQL_Where:='"artikelid" = '+IntToStr(TKomArticle(DataObj).ID);

    SelectAll(jkKomArticles);
 
    TKomArticle(DataObj).ID:=getInteger('artikelid');
    TKomArticle(DataObj).Titel:=getString('titel');

    //Hier werden die Daten nachgeladen
    if not (Teaser) then
    begin
      TKomCategory(DataObj).Text:=getBlob('artikeltext');
      TKomCategory(DataObj).Erstellt:=getInteger('erstelltam');
      ...
      ...
    end;
  end;
end;
Welche Methode ist die bessere? Gleich alles auf einmal oder doch lieber Nachladen - wobei das mehr "Programmier"-Aufwand ist.

Danke im Voraus

Hansa 17. Jan 2010 12:33

Re: [OOP] Wie viele Daten aus der DB laden?
 
Sofern das + geklickt wird : nachladen. Allerdings : wenn alles geladen wird, wirkt sich das überhaupt irgendwie aus ? Bei einzelnen kleinen Tabellen ohne Join usw. ist fraglich, ob sich der Aufwand überhaupt lohnt. :shock:

TheMiller 17. Jan 2010 12:43

Re: [OOP] Wie viele Daten aus der DB laden?
 
Genau das war ja meine Frage ;)

Aber ich denke so: Der Anwender hat viele Artikel eingetragen. Alle Artikel liegen im Text in RTF vor. Wenn ich jetzt beim Erstellen der Liste alle ArtikelTexte und andere Daten mitlade, dann knallt's den RAM auf die Dauer bestimmt schon zu, oder?

Oder anders gefragt: Wenn ich ein Objekt erstelle - sagen wir mal TArticle - , wieviel Speicher wird dann belegt? Der maximal vom Objekt benötigte Speicher, oder ändert sich der tatsächlich benutzte Speicher, wenn ich Daten nachlade?

Angenommen, ein Objekt reserviert sich sowieso den maximal benötigten Speicher, dann kann ich mir das mit dem Nachladen ja auch schenken...

Hansa 17. Jan 2010 13:01

Re: [OOP] Wie viele Daten aus der DB laden?
 
Du musst doch wissen, wo überall mit Create neue Objekte erzeugt werden. Create = brauche Speicher. :shock: Also : Wird vorerst nur irgendeine Bezeichnung angezeigt und der Rest beim Klicken auf +, dann kann man das ja schön in zweites Objekt nachladen. Das erste braucht ungefähr soviel, wie die Bezeichnung braucht (der Tree selber wird auch noch zusätzlich was verbraten). Tja, wird nun noch mehr angezeigt, dann braucht das eben soviel zusätzlich, wie es eben braucht. :mrgreen:

TheMiller 17. Jan 2010 13:14

Re: [OOP] Wie viele Daten aus der DB laden?
 
Hm. Entweder reden wir aneinander vorbei, oder ich habe nicht verstanden, was du meinst.

Also, lade die ganzen Artikel und erstelle dabei Artikel-Objekte. Diese liegen in einer typisierten TObjectList (TArticleList). Die Data-Eigenschaft der TreeView enthält einen Zeiger auf das Objekt.

Nun ist die Frage, in welchem Zustand das konkrete Artikel-Objekt den meisten Speicher verwendet. Reserviert es sich den maximal notwendigen Speicher beim Create, unabhängig davon, ob Inhalt in ArtikelText etc. steht, oder wächst eben der Speicherverbrauch, wenn ich späterhin die Eigenschaften mit Inhalt fülle?

Würde sich das Objekt nämlich sofort den maximalen Speicher resevieren, bräuchte ich nur einmal alles laden und dann nach Bedarf einfach nur dort anzeigen, wo ich es brauche. Das würde mir viel Arbeit ersparen.

Hansa 17. Jan 2010 15:41

Re: [OOP] Wie viele Daten aus der DB laden?
 
Ich verwende etliche TObjectList(en). Du musst mir aber jetzt mal erklären, warum die bei einem Tree überhaupt notig ist. Ein Tree ist quasi auch eine Liste. 1 Dimension wäre eine TObjectList, also linear, nur eine einfache Kette. Der Tree verzweigt aber noch oder er hat nur die Root-Nodes. Du musst zumindest das Problem auf die Liste reduzieren (wozu aber dann der Tree ? :gruebel: ).

TheMiller 17. Jan 2010 15:49

Re: [OOP] Wie viele Daten aus der DB laden?
 
Hi, der Tree dient nur zur Auflistung aller Artikel. Die Data-Eigenschaft der Tree-Items beinhalten einen Zeiger zum eigentlichen Artikel-Objekt in der TArticleList (Ableitung der TObjectList). So habe ich es bis jetzt immer gemacht. Der Tree hat natürlich noch Unterebenen. Die Artikel sind ja in Kategorien drin - diese sind übergeordnete Nodes, können aber auch beliebig viele Unterkategorien haben.

Ich verstehe aber jetzt nicht ganz, was das mit der Frage zu tun hat, wann ein Objekt wieviel Speicher belegt. (Das soll jetzt nicht böse/aggressiv/genervt etc. klingen ;) )

chaosben 17. Jan 2010 16:54

Re: [OOP] Wie viele Daten aus der DB laden?
 
Wir haben bei unserer Datenlogik-Schicht ein Timeout eingebaut. Irgendwann (Random) zwischen 4 und 6 Minuten werden die eigentlichen Daten des Artikels (oder was auch immer) weggeworfen und es bleibt ein fast leeres Artikel-Objekt zurück. Wenn dann wieder jemand das Objekte nach den Daten fragt, holt es sich die Daten wieder von der DB.
Das funktioniert bisher (seit 1,5 Jahren) ganz gut - auch auf minderbemittelten ;) Rechnern.

TheMiller 17. Jan 2010 17:59

Re: [OOP] Wie viele Daten aus der DB laden?
 
Hi,

das ist zwar eine gute Idee, ist aber auch nicht das, was ich wissen wollte ;)

Angenommen, wir haben ein Objekt aus folgender Klasse

Delphi-Quellcode:
TArtikel = class(TObject)
private
  fID: Integer;
  fKategorie: Integer;
  fTitel: String;
  fRTFText: String;
public
  constructor Create;
  destructor Destroy; override;

  property ID: Integer read fID write fID;
  property Kategorie: Integer read fKategorie write fKategorie;
  property Titel: Integer read fTitel write fTitel;
  property fRTFText: String read fRTFText write fRTFText;
end;

procedure TDB.Read(Data: TObject)
begin
  if (Data) is TArtikel then
  begin
    Select(tbArtikel);
    TArtikel(Data).Titel:=getString('titel');
    TArtikel(Data).RTFText:=getBlob('artikeltext');
    ...
    ...
  end;
end;

procedure TForm1.Create....
var
  a: TArtikel;
begin
  {
  Angenommen, das Objekt hat eine maximale Größe von 100kb ;)
  Wo werden die 100kb reserviert?
  }
  a:=TArtikel.Create; //Schon hier?
  db.Read(a); //Oder erst hier, da die Daten aus der DB eingetragen werden?
  a.Free;
end;
Wenn das Objekt überhaupt eine feste Größe hat (was ich glaube durch die Angaben der Datentypen in der Klasse), wäre es toll zu wissen, wo die fiktiven 100kb tatsächlich reserviert werden. Denn: Wenn sie erst mit Abfragen der DB-Daten reserviert/genutzt werden, dann wäre es doch besser, erst die wichtigsten Daten zu laden und später einzelne Daten bei Bedarf nachzuladen.

Hier kommt es natürlich auf die Masse der Objekte an - das ist klar.

Vielen Dank

chaosben 18. Jan 2010 06:37

Re: [OOP] Wie viele Daten aus der DB laden?
 
Zitat:

Zitat von DJ-SPM
Delphi-Quellcode:
procedure TForm1.Create....
var
  a: TArtikel;
begin
  {
  Angenommen, das Objekt hat eine maximale Größe von 100kb ;)
  Wo werden die 100kb reserviert?
  }
  a:=TArtikel.Create; //Schon hier?
  db.Read(a); //Oder erst hier, da die Daten aus der DB eingetragen werden?
  a.Free;
end;

Der Speicher wird durch beide Anweisungen belegt.
Beim Erstellen des Objektes wird für die "festen" Variablen (Integer, Float, ...) Speicher benötigt.
Beim Lesen aus der DB wird dann der Speicher für die "variablen" Variablen (Strings, ...) gebraucht.
Insofern: Die Wahrheit liegt wiedermal dazwischen.

Wenn du den Speicher zu einem von dir definierten Zeitpunkt allozieren willst, musst du dich um alles selbst kümmern ... sprich Pointer auf deine Variablen halten.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:23 Uhr.
Seite 1 von 2  1 2      

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