AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

[OOP] Wie viele Daten aus der DB laden?

Ein Thema von TheMiller · begonnen am 17. Jan 2010 · letzter Beitrag vom 22. Jan 2010
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#1

[OOP] Wie viele Daten aus der DB laden?

  Alt 17. Jan 2010, 13:16
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
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#2

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

  Alt 17. Jan 2010, 13:33
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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#3

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

  Alt 17. Jan 2010, 13:43
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...
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#4

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

  Alt 17. Jan 2010, 14:01
Du musst doch wissen, wo überall mit Create neue Objekte erzeugt werden. Create = brauche Speicher. 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.
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#5

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

  Alt 17. Jan 2010, 14:14
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.
  Mit Zitat antworten Zitat
Hansa

Registriert seit: 9. Jun 2002
Ort: Saarland
7.554 Beiträge
 
Delphi 8 Professional
 
#6

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

  Alt 17. Jan 2010, 16:41
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 ? ).
Gruß
Hansa
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#7

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

  Alt 17. Jan 2010, 16:49
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 )
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#8

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

  Alt 17. Jan 2010, 17:54
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Benutzerbild von TheMiller
TheMiller

Registriert seit: 19. Mai 2003
Ort: Gründau
2.480 Beiträge
 
Delphi XE7 Architect
 
#9

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

  Alt 17. Jan 2010, 18:59
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
  Mit Zitat antworten Zitat
Benutzerbild von chaosben
chaosben

Registriert seit: 27. Apr 2005
Ort: Görlitz
1.358 Beiträge
 
Delphi XE2 Professional
 
#10

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

  Alt 18. Jan 2010, 07:37
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.
Benjamin Schwarze
If I have seen further it is by standing on the shoulders of Giants. (Isaac Newton)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:32 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