Datenhaltung bei DB Zugriff

goodcat

Aktives Mitglied
Hi,

ich habe ein Programm das Daten komplett in einer MySQL DB speichert.
Wenn ich das Programm (Multiple Document Interface) starte werden alle Daten (ob Sie in diesem Moment benötigt werden oder nicht) einmal abgerufen und in passende Objekte verpackt. Diese Objekte werden in Listen(Vektoren - da ich mit Vektoren die Daten schnell in eine ComboBox oder JTable packen kann) gespeichert. Wenn ich jetzt ein JInternalFrame aufrufe, wird ein refresh auf die relevanten Daten (nicht alle Daten - z.B. nur Benutzerinformationen) angewendet, die Objekte werden aktualisiert und die benötigten Listen mit den Objekten werden dem neuen Frame übergeben (das aktualisieren geht selbst bei großen Datenmengen (20000 DB Sätze) ziemlich schnell!).

Jetzt habe ich gehört das diese Art der "doppelten" Datenhaltung nicht sinnvoll ist und ich früher oder später mit Speicherprobleme zu kämpfen habe... Was sagen die Experten dazu?

Interessanterweise verbraucht das Programm mehr Speicher und ist bei weitem nicht so performant wenn ich die Objekte nur dann instanziere wenn Sie benötigt werden!


Danke im voraus!
 
Zuletzt bearbeitet:

XHelp

Top Contributor
Kann man so pauschal nicht sagen. Wenn es Daten sind, die im Moment nicht benötigt werden, aber in 5 Sekunden instant da sein müssen, dann könnte es schon sinnvoll sein. Ansonsten ist es aber murks.
Zu der Performanz lässt sich auch pauschal nichts sagen. Wenn du ständig eine neue Verbindung aufbaust um einen Datensatz zu holen, dann kann das einmalige Auslesen von Daten (mit einer Verbindung) schon performanter sein. Aber das liegt eben nur an der Implementierung.
 

goodcat

Aktives Mitglied
Mh also die Daten müssen nicht Instant da sein. Also ist es wohl eher murks :autsch: ...
Habe mir mehr Gedanken über zu viele DB Abfragen und eine schlechte Performanz als über den Speicherplatz gemacht. Wenn ich einen Datensatz abrufe kann es sein das da locker irgendwas zwischen 10-20 Abfragen folgen... Das fand ich irgendwie nicht besonders schön... Verdammt und das Programm läuft wirklich richtig gut ;(

Mist also den ganzen Kram in die Tonne und wieder ans Zeichenbrett.
 

timbeau

Gesperrter Benutzer
Moment,

solange du KEINE Speicherplatzprobleme hast, lass alles so wie es ist.
Never change a running system.

Und dauernd die Db zu beanspruchen (Netzwerk, Festplatte, evtl ausgelasteter Server :autsch:) ist nicht gut.
 

goodcat

Aktives Mitglied
Speicherprobleme werde ich vermutlich erst in vielen vielen Jahren haben. Ich habe einen test mit 20000 DB Sätzen in einer Tabelle gestartet (Daten aus dem Taskmanager).
1. Programmstart ca. 57MB (ohne Daten)
2. Nach dem abrufen der Daten geht es auf ca. 80MB hoch.
3. Wenn dann eine JTable geöffnet wird und das ganze in ein DefaultTableModel übertragen wird sind es insgesamt 110MB-120MB.

Ärgerlich wäre es nur wenn ich in 3 Jahren feststelle das Programm hängt mit 500MB oder mehr im Arbeitsspeicher.
Selbst das wäre bei den heutigen Systemen kein Problem. Wer hat schon weniger als 1GB Speicher in seiner Kist...

Nur die Frage war ob diese Art der Datenhaltung sinnvoll ist und das scheint ja nicht der Fall zu sein. Wenn Ihr gesagt hättet "das kann man so machen", dann würde ich mir keinen Kopf machen.

Tjo einerseits habe ich absolut keine Lust alles neu zu machen. Andererseits kann ich schon nachvollziehen wieso meine Art der Datenhaltung murks ist. :(
Da ich noch in der Entwicklung bin sollte man es gleich richtig machen.

Komisch an der Sache ist das wenn ich die Daten nur abrufe wenn ich Sie benötige und das InternalFrame schließe geht der Speicher im Taskmanager nicht runter. Er bleibt bei 120MB stehen. Referenzen auf die Klassen gibt es auch nicht mehr (soweit ich das feststellen konnte) so das der GC eigentlich den Speicher räumen sollte.. Oder verstehe ich da was falsch?
 

XHelp

Top Contributor
Das was du im Taskmanager siehst, ist nicht der tatsächliche Speicherverbrauch, sondern der reservierte Speicher. Und der GC wird ggf überhaupt nicht aufgerufen, wenn noch Speicher da ist.
 

timbeau

Gesperrter Benutzer
Stichwort VisualVM. Kann im Eclipse statt des Eclipse Launchers eingestellt werden und visualisiert wunderschön den Speicherverbrauch deines Progs.
 

goodcat

Aktives Mitglied
Ahh Supertool. Habs gerade mal ausprobiert.

Kann ich damit auch schauen ob eine bestimmte Klasse dem GC übergeben wurde?
Ich möchte überprüfen ob beim schließen meine Klasse mit den ganzen Daten auch "gelöscht" wurde.
Laut dem Memory Dump besteht immer noch eine krasse differenz...
 
V

vanny

Gast
Also, dass das Vorhalten größerer Datenmengen murks ist, würd ich jetzt auch nicht einfach so unterschreiben wollen.

Sicherlich sollte der Datenpool der quasi im Precache landet einen angemessenen Rahmen nicht sprengen.

In deinem Fall würd ich mir ne Rechnergurke suchen und dort mal einen Belastungstest machen um zu sehen, bis wo man das Spielchen treiben könnte/sollte.
Dann ziehste zur Sicherheit noch n bissl was ab und weisst, bis wohin man die Daten von der DB als fertige Objekte vorhalten kann bevor man wieder mit der DB interagieren muss.

Gruß Vanny
 

goodcat

Aktives Mitglied
Also mit der DB muss ich quasi jedesmal beim öffnen eines Eintrags "sprechen" da dieses Tool vermutlich im Netzwerk genutzt werden soll. Sprich von mehreren Benutzern. Und deshalb muss ich ja garantieren können das alle Benutzer immer aktuelle Daten haben wenn Sie einen Datensatz öffnen.

Jetzt stelle ich mir die Frage wie ich vorgehen soll wenn im Precache zu viele Einträge sind und ich mit der DB interagieren muss. Es muss dann ja überprüft werden das meine Liste mit Objekten die Anzahl von z.B. 200 Einträgen nicht überschreitet. Und dann? Wie soll ich weiter vorgehen wenn meine Daten Zentral liegen und nur an die JInternalFrames übergeben werden.
 

homer65

Top Contributor
...
(das aktualisieren geht selbst bei großen Datenmengen (20000 DB Sätze) ziemlich schnell!).

Jetzt habe ich gehört das diese Art der "doppelten" Datenhaltung nicht sinnvoll ist und ich früher oder später mit Speicherprobleme zu kämpfen habe... Was sagen die Experten dazu?

Interessanterweise verbraucht das Programm mehr Speicher und ist bei weitem nicht so performant wenn ich die Objekte nur dann instanziere wenn Sie benötigt werden!


Danke im voraus!

Also 20000 Sätze ist keine große Datenmenge. Das ist eher klein.
Wenn es dabei bleibt kannst du ruhig alles komplett im Programm verwalten.
 

goodcat

Aktives Mitglied
Also am Anfang werden es um die 300-400 DB Sätze sein. Aber es wird über die Jahre wachsen, Bis 20000 Einträge erreicht sind kann es dauern. Aber keine Ahnung wann die Magische Grenze erreicht ist und mir das Ding um die Ohren fliegt ... Und dann alles umändern wird kaum funktionieren.. Dann lieber jetzt wo es noch entwickelt wird.

Ich tendiere schon in die Richtung die Daten abzurufen wenn die benötigt werden. Das Problem was ich habe ist das jedes Fenster also jedes JInternalFrame die Daten im Model hält. Das sind pro Fenster 10 DB abfragen, wenn ich jetzt 5 Fenster aufhabe und in einem Fenster ein refresh starte wollen alle Fenster neue Daten haben, d.h. es sind nicht mehr 10 Abfragen sondern 50.
 
V

vanny

Gast
Ok, also langsam wirds suspekt;)

Wenn du mit InternalFrames arbeitest, dann arbeitest du doch mit nur einem Programm, und zwar mit dem, in dem die InternalFrames laufen.
Was spricht also dagegen, wenn alle die selben Daten benutzen?

Stichwort MVC ist hier vielleicht angebracht.

Wenn du allerallerdingensdings mit mehreren Programminstanzen arbeitest, könntest du ja ein client<-->server Konstrukt benutzen und die Datenverwaltung auf eine zentrale Stelle auslagern.

Mir is halt langsam nich mehr klar, was du da eigentlich umsetzt.

Gruß Vanny
 

goodcat

Aktives Mitglied
Also MVC benutze ich bereits. Und die Daten hatte ich (bevor ich diesen Thread eröffnet habe) alle in einem zentralen Model liegen. Beim Programmstart habe ich die Daten geholt und nur noch aktualisiert.

Aber ich wurde darauf aufmerksam gemacht das es keinen sinn macht und es besser wäre die Daten nur zu laden wenn ich Sie benötige und danach wieder vom GC löschen zu lassen. Deshalb kümmert sich jetzt nur noch das Model des entsprechenden JInternalFrames um das instanzieren der Objekte und abrufen der Daten aus der DB. Vorher lagen die Daten immer in einem zentralen Model egal ob sie benötigt wurden oder nicht.

Und es könnte ja sein das in ein paar Jahren die DB so krass wächst das es zu Speicherproblemen kommt.

Kann man denn pauschal die Frage beantworten ab welcher Anzahl an Datensätzen diese Art der Datenhaltung (also alle Daten die benötigt werden oder auch nicht aus der Datenbank abrufen und in einem Model speichern) keinen sinn mehr macht bzw. es zu Speicherproblemen kommen kann. Obwohl "XHelp" das als nicht besonders sinnvoll beschrieben hat.
 
Zuletzt bearbeitet:

XHelp

Top Contributor
also ab 13541,7 Objekte lohnt es sich nicht mehr. :joke:
Es kommt nicht so sehr auf das die Anzahl, als auf den Sinn. Wenn du es wirklich brauchst, dann brauchst du es eben. Aber ob du es in diesem konkretem Fall brauchst oder nicht, lässt sich natürlich pauschal nicht beantworten.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
I Klassen Java Qt Model/View Datenhaltung Java Basics - Anfänger-Themen 4
J Datenhaltung ohne Server Java Basics - Anfänger-Themen 19
I In unterschiedlichen Applikation Zugriff auf eine gemeinsame Anwendung? Java Basics - Anfänger-Themen 8
C Zugriff auf Methode Java Basics - Anfänger-Themen 2
I Applikationsserver (WildFly) - Zugriff auf Ressourcen.. Problem mit Pfade Java Basics - Anfänger-Themen 10
J Zugriff auf eine 2. Klasse die per UI-Designer erstellt wurde Java Basics - Anfänger-Themen 1
Encera Zugriff auf Map-Objekte Java Basics - Anfänger-Themen 3
T Zugriff auf Control anderer Klasse Java Basics - Anfänger-Themen 5
W Unterschiede bei Zugriff auf Objekt und Klassenvariablen über einen Getter? Java Basics - Anfänger-Themen 2
EchtKeineAhnungManchmal hallo habe ein Problem mit einer Datei -> (Zugriff verweigert) Java Basics - Anfänger-Themen 4
R TreeSet Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 8
C Kein Zugriff auf Klassenmethoden in Main Methode Java Basics - Anfänger-Themen 23
H Zugriff verweigert Java Basics - Anfänger-Themen 5
moiss002 Umgebungsvariable Kein Zugriff auf ein Array Java Basics - Anfänger-Themen 7
B Probleme mit Zugriff auf Dateisystem Windows 10 ( jFileChooser) Java Basics - Anfänger-Themen 17
B Zugriffsmodifier, Zugriff außerhalb Package Java Basics - Anfänger-Themen 5
C Zugriff auf Attribut von Oberklasse Java Basics - Anfänger-Themen 8
P Klasse hat keinen Zugriff auf getter/setter-Methoden eines Objektes Java Basics - Anfänger-Themen 9
B Methoden Methoden haben kein Zugriff auf variablen Java Basics - Anfänger-Themen 4
M Gettter/Setter Methoden Klassenfelder kapselung und zugriff? Java Basics - Anfänger-Themen 1
S Zugriff auf protected Fields = guter Programmierstil? Java Basics - Anfänger-Themen 11
M Pfadprobleme - Zugriff auf einen Ordner im Workspace Java Basics - Anfänger-Themen 17
ruutaiokwu Bluetooth-Zugriff, braucht es dazu plattformabhängige Libraries oder kann das Java mittlerweile selbst? Java Basics - Anfänger-Themen 10
R Zugriff auf den Index eines Arrays, welches ein Objekt ist. Java Basics - Anfänger-Themen 4
M Zugriff auf eine ArrayList in einer anderen Klasse Java Basics - Anfänger-Themen 4
P Zugriff auf Variablen anderer Klassen in Greenfoot Java Basics - Anfänger-Themen 1
L Methoden Zugriff <identifier> expected Java Basics - Anfänger-Themen 13
T Java - Zugriff nur mit CLASSPATH ? Java Basics - Anfänger-Themen 7
B Klassen Zugriff auf ein Objekt einer Klasse aus einer Methode heraus Java Basics - Anfänger-Themen 4
L Zugriff auf Attribute eins Objekts über ActionListener Java Basics - Anfänger-Themen 4
D Zugriff auf Methode einer anderen Klasse Java Basics - Anfänger-Themen 5
S Zugriff auf Objekt Java Basics - Anfänger-Themen 5
A Klassen Zugriff auf Instanzen Java Basics - Anfänger-Themen 2
N ArrayList in eigener Klasse erzeugen mit Zugriff Java Basics - Anfänger-Themen 7
J Zugriff auf Variable in anderem Programm Java Basics - Anfänger-Themen 5
Q Zugriff auf Attribute Java Basics - Anfänger-Themen 3
J Klassen Zugriff auf ein "String Array" Java Basics - Anfänger-Themen 6
H Datentypen ArrayList in ArrayList: Zugriff Java Basics - Anfänger-Themen 6
J get methoden zugriff und objekt erzeugung Java Basics - Anfänger-Themen 30
J Datenbank Zugriff Java Basics - Anfänger-Themen 24
T Zugriff auf JCheckBox Java Basics - Anfänger-Themen 8
E Netzlaufwerk Zugriff schlägt fehl Java Basics - Anfänger-Themen 11
C Group, Actor und Instanz-Zugriff, LibGDX Java Basics - Anfänger-Themen 4
S Zugriff auf Attribut einer unbekannten Klasse erhalten Java Basics - Anfänger-Themen 6
R Methoden Methode der GUI-Klasse Zugriff auf Methoden der Hauptklasse Java Basics - Anfänger-Themen 9
S Vererbung Zugriff auf die Basisklasse einer "zweiten" Erweiterungsklasse Java Basics - Anfänger-Themen 2
Z Threads Threads - Zugriff auf Ressourcen ohne(Lock, Synchronized) Java Basics - Anfänger-Themen 2
S Vererbung Zugriff auf Methode funktioniert nicht (static/non-static) Java Basics - Anfänger-Themen 3
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J Sichtbarkeit und Zugriff Java Basics - Anfänger-Themen 9
G Wieviel kostet der Zugriff auf Objektattribute im Vergleich zur Erstellung von vars in Methode? Java Basics - Anfänger-Themen 11
L Zugriff auf zwei Java-Quellcodes Java Basics - Anfänger-Themen 3
A OOP Zugriff auf Objekte von außen Java Basics - Anfänger-Themen 8
M Kapselung Datenkapselung Sinn direkter Zugriff? Java Basics - Anfänger-Themen 1
G Methoden Zugriff auf Methode.. aus einer anderen Klasse Java Basics - Anfänger-Themen 6
J JDialog Zugriff auf parent JDialog Java Basics - Anfänger-Themen 5
K Collections Zugriff auf ein bestimmtes Element in der Collection Java Basics - Anfänger-Themen 1
K ArrayList in Konstruktor - wie späterer Zugriff Java Basics - Anfänger-Themen 2
F Zugriff auf Objekt einer anderen Klasse Java Basics - Anfänger-Themen 7
P Zugriff auf Felder in ArrayList Objekten Java Basics - Anfänger-Themen 2
J Erste Schritte Zugriff auf Eigenschaft Java Basics - Anfänger-Themen 2
M MVC - Problem mit Zugriff auf Objekt Java Basics - Anfänger-Themen 4
D Zugriff auf von einer anderen Klasse erstellten Objekten Java Basics - Anfänger-Themen 5
C 5 - Zugriff verweigert Java Basics - Anfänger-Themen 1
K Zugriff auf Variabeln Wert einer Instanz Java Basics - Anfänger-Themen 4
A Methoden Zugriff auf eingelesene Variablen in der main Methode (ohne Änderung der Parameterliste) Java Basics - Anfänger-Themen 4
Z Methoden Zugriff mit Klasse 3 auf Methode von Klasse 2 welche in Klasse 1 erzeugt wird Java Basics - Anfänger-Themen 6
Z Zugriff auf andere Methoden Java Basics - Anfänger-Themen 12
Z Zugriff auf Pakete Java Basics - Anfänger-Themen 5
G Zugriff zwischen Klassen Java Basics - Anfänger-Themen 15
N Problem mit Swing Textfeld und Zugriff aus anderer Klasse Java Basics - Anfänger-Themen 6
H Kein Zugriff auf das Element einer JList möglich: Fehlermeldung Java Basics - Anfänger-Themen 2
W OOP Zugriff auf mit Objekt erstellte Struktur Java Basics - Anfänger-Themen 7
F Klassen Zugriff auf Fenster aus versch. Klassen Java Basics - Anfänger-Themen 5
M Variablen Zugriff von außerhalb eines Blockes auf eine Variable innerhalb eines Blockes Java Basics - Anfänger-Themen 2
U Methoden Zugriff auf Array von weiterer Methode einer Klasse, Rückgabewert Problem Java Basics - Anfänger-Themen 5
B Klassen Zugriff auf Daten der Child-Klasse Java Basics - Anfänger-Themen 9
W Typisierte ArrayList und der Zugriff auf den Typ Java Basics - Anfänger-Themen 5
M Zugriff auf Klasse Java Basics - Anfänger-Themen 2
K Zugriff auf C: Java Basics - Anfänger-Themen 5
S Das richtige Format für den SOAP Zugriff Java Basics - Anfänger-Themen 0
S Klassen Zugriff auf Attribute einer zweiten Klasse, welche durch dritte gesettet wurden? Java Basics - Anfänger-Themen 2
N Zugriff bei Package Struktur Java Basics - Anfänger-Themen 6
M Enum: Zugriff auf Konstanten Java Basics - Anfänger-Themen 7
V Zugriff auf jProgressbar Java Basics - Anfänger-Themen 10
B Zugriff auf csv-Datei per hashmap Java Basics - Anfänger-Themen 5
G Spalte in JTable unsichtbar machen, Zugriff auf Daten ermöglichen Java Basics - Anfänger-Themen 2
T ZUgriff auf 'Werte' Java Basics - Anfänger-Themen 3
J Vererbung Zugriff auf private Variable Java Basics - Anfänger-Themen 10
C Klassen Zugriff auf Objekt anderer Klasse Java Basics - Anfänger-Themen 8
B Methoden Zugriff auf Variable ermöglichen Java Basics - Anfänger-Themen 3
M Zugriff auf Arraylist Java Basics - Anfänger-Themen 7
D Kein Zugriff auf JFrame Java Basics - Anfänger-Themen 2
K Zugriff einer Klasse auf eine andere Andere -> bad operand for binary operator Java Basics - Anfänger-Themen 5
B Erste Schritte Array-Zugriff Java Basics - Anfänger-Themen 10
D OOP Zugriff auf Objekte A in Klasse A aus Objekt B in Klasse B Java Basics - Anfänger-Themen 3
T Collections Zugriff auf Elemente aus Iterator() Schleife Java Basics - Anfänger-Themen 4
J Threads Zugriff auf Attribute Java Basics - Anfänger-Themen 16
N Kein Zugriff auf Ordner -> NullPointerException Java Basics - Anfänger-Themen 2
I kein zugriff auf jList oder Textfield Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben