Verwaltung von sehr vielen Objekten

disconnectus

Aktives Mitglied
Hallo Zusammen,



in meinem Java Programm habe ich sehr viele verschiedene Objekte von verschiedenen Klassen. Insgesamt habe ich ein paar Tausende Objekte. Diese Objekte müssen einmal aus der Datenbank geladen werden danach immer wieder von mehreren verschiedene Klassen zugegriffen werden.

Wie können diese Objekte von mehreren verschiedenen Klassen erreichbar sein? Ich habe dafür statische Listen von diesen Objekten erstellt und greife von verschiedenen Klassen immer zu diesen Listen zu.

Ist das sinnvoll? Gibt es einen besseren Weg?

Unten ist eine Beispiel Klasse von dem ich sehr viele Objekte erstelle. Ich habe mährere klassen ähnlich wie deise Klasse. Aus denen erstelle ich auch sehr viele Objekte und hinzufüge ich diese Objekte in die Statische Liste der entsprechenden Klasse. Static List ist auch in der Code zu sehen.

Java:
 public class Profile {

  public static List<Profile> profileList = new ArrayList<Profile>(); // die Statische Liste, zu der ich zugreife.


  private String profileName;
  private TreeMap<String, Float> mapProfileValues = new TreeMap<String, Float>();

  Profile(String profileName, TreeMap<String, Float> mapProfileValues){
    this.profileName = profileName;
    this.mapProfileValues = mapProfileValues;
  }

  public String getProfileName() {
    return profileName;
  }

  public TreeMap<String, Float> getMapProfileValues() {
    return mapProfileValues;
  }
}



Eine alternative Lösung wäre zum Beispiel keine statischen Listen zu erzeugen und nicht statische Listen von Objekten immer als Parameter in den Konstruktoren und Methoden einzugeben. In diesem Fall habe ich aber sehr viele Parameter in den Methoden und Konstruktoren und manche Listen müssen immer weitergeleitet werden.

Noch eine Alternative Lösung wäre eine nicht statische List von Listen zu erstellen. Alle Listen von Objekten zu dieser großen List zu hinzufügen und danach diese große List als parameter in den Konstruktoren und Methoden eingeben.

Wie soll ich vorgehen?



Danke im Voraus
 
Zuletzt bearbeitet von einem Moderator:

Thallius

Top Contributor
Eine Datenbank ist eigentlich genau dafür gedacht, dass die Daten dann geladen werden wenn sie gebraucht werden und nicht das du sie einmal komplett ins RAM lädst und fertig. Damit hebelst du alle DB Mechanismen aus.

Gruß

Claus
 

stg

Top Contributor
Naja, eine Datenbank ist eigentlich erst einmal primär für die persistente Datenhaltung. Daten aus dem RAM zu holen ist ja nun doch in der Regel schneller, als sie erst aus der Datenbank zu laden, aufzubereiten und dann erst darauf zuzugreifen. Bei vielen lesenden und wenigen schreibenden Zugriffen lohnt sich ein Caching in der Regel durchaus, aber das selbst gescheit zu programmieren ist schon ne Hausnummer ... glücklicherweise liefern einige JPA-Anbieter das schon frei Haus mit :)

Ich würde jedoch auch zunächst dazu raten einfach die Daten abzurufen, die du gerade brauchst. Bei sauberer Trennung der Verantwortlichkeiten kannst du dich ohne allzu großen zusätzlichen Aufwand hinterher immer noch ums Caching kümmern.
 

Thallius

Top Contributor
Naja, eine Datenbank ist eigentlich erst einmal primär für die persistente Datenhaltung. Daten aus dem RAM zu holen ist ja nun doch in der Regel schneller, als sie erst aus der Datenbank zu laden, aufzubereiten und dann erst darauf zuzugreifen. Bei vielen lesenden und wenigen schreibenden Zugriffen lohnt sich ein Caching in der Regel durchaus, aber das selbst gescheit zu programmieren ist schon ne Hausnummer ... glücklicherweise liefern einige JPA-Anbieter das schon frei Haus mit :)

Ich würde jedoch auch zunächst dazu raten einfach die Daten abzurufen, die du gerade brauchst. Bei sauberer Trennung der Verantwortlichkeiten kannst du dich ohne allzu großen zusätzlichen Aufwand hinterher immer noch ums Caching kümmern.

Jede aktuelle DB cacht doch selber. Das selber zu machen kann nur schlechter werden.

Gruß

Claus
 

stg

Top Contributor
Das Caching auf DB Ebene hat doch damit rein gar nichts zu tun, rch rede hier nur vom Caching auf Applications-Ebene. Da müssen die Daten ja erst einmal irgendwie hinkommen. Die Abfrage kostet Zeit, der Datentransfer kostet Zeit und auch das Mapping kostet Zeit. Ob und wieviel das Caching tatsächlich bringt, muss man in jedem Einzelfall zwar gesondert betrachten, aber wir sprechen hier durchaus von einem Faktor von bis zu 1000! Ganz interessanter Artikel zu dem Thema, wie ich finde: http://java-persistence-performance.blogspot.de/2013/01/got-cache.html
 

Thallius

Top Contributor
Die Frage ist ja was willst du mit mehreren zigtausend Objekten machen? Anzeigen? Wohl kaum, denn ein User wird nirgendwo eine Liste mit tausend Einträgen sehen wollen. Grafisch darstellen? Schon eher, aber brauchst du dafür immer alle zigtausend oder wirst du eher nur einen Teilmenge anzeigen? Damit rechnen? Kann schon sein aber auch da ist nicht sehr wahrscheinlich, dass du alle zigtausend immer und überall in deiner App brauchst wie der TO geschrieben hat.

Ergo macht dieses Anliegen einfach keinen Sinn.

Gruß

Claus
 

stg

Top Contributor
Tu doch nicht immer alles so schnell ab :D
...und lass dir einfach mal gesagt sein, dass es durchaus einen erheblichen Vorteil bringt, wenn die Anwendung mal komplexer wird und für viele User ausgelegt ist.

Dass man das nicht selbst machen sollte, und wenn, dann wohl kaum in der Form, in der es der TE hier anstrebt, da hab ich dir doch außerdem schon längst zugestimmt :)
 

Thallius

Top Contributor
Tu doch nicht immer alles so schnell ab :D
...und lass dir einfach mal gesagt sein, dass es durchaus einen erheblichen Vorteil bringt, wenn die Anwendung mal komplexer wird und für viele User ausgelegt ist.
:)

Gerade wenn du es für viele User auslegst ist es ja ein NoGo die Daten im Ram zu halten. Dann würde eine Änderung daran ja niemals bei einem anderen Client ankommen.

Und wenn du irgendwelche Sortierungen oder Filterungen brauchst, dann ist es auch besser wenn es die DB einmal macht und nicht jeder Client für sich.

Gruß

Claus
 

stg

Top Contributor
Das ist totaler Quatsch. Du hast einen Cache für die gesamte Anwendung, den teilen sich also alle User. Der Client bekommt eine Arbeitskopie der Daten, die er gerade braucht (bzw unter Umständen auch keine Kopie, sondern direkt die Referenzen auf die gecacheten Objekte). Werden Daten geändert, so müssen nur die Änderungen mit dem Cache in geeigneter Weise synchronisiert werden. Das muss man, wenn mans richtig anstellt, aber auch nicht selbst machen, sondern das geschieht dann völlig transparent. Mitunter hast du dann sogar die Möglichkeit Clients direkt und ohne, dass diese irgendwie pollen müssen, über Änderungen zu informieren.

Und nein, das heißt nicht, dass man grundsätzlich alles und überall cachen sollte. Ich lagere auch sehr viel auf die Datenbank aus. Aber vorallem Daten, die sehr oft gelesen, aber nur selten oder gar nicht geändert werden, sollten zumindest in der OOP Welt gecached werden.
Die Wahrheit liegt im Endeffekt immer irgendwo dazwischen und man entscheidet von Fall zu Fall (innerhalb einer Anwendung).
 

disconnectus

Aktives Mitglied
Ich kann nicht weniger Objekte haben. Das Programm lädt mehrere Tabellen aus der Datenbank, bearbeitet diese Daten und gibt sie in einem Excel-datei aus.
Die Aufgabe ist sehr viele verschiedene Daten aus der Datenbank hollen, sie miteinander in beziehung setzen, irgendwie aggregieren, in einen betimmte format bringen und ausgeben.
Dieses Programm vorbereitet Daten für ein großes Modell.

Wenn ich die Daten bearbeite, brauche ich manchmal Daten aus der verschiedenen Tabellen. Ein Objekt beinhaltet sogar mehrere Informationen aus mehreren Tabellen. Ich muss am Ende sowieso sehr viele Objekte gleichzeitig im Cache haben.

Die Frage ist wie ich diese Objekte am besten verwalten kann?
 
Zuletzt bearbeitet:

disconnectus

Aktives Mitglied
Ich habe kein Problem mit meinem Programm. Ich komme zurecht. Mein Programm läuft ohne Probleme ganz gut in angemessene Zeit.

Meine Frage ist, ob ich mein Programm wie üblich und smart genug programmiert habe.

Das ist mein erstes großen Projekt. Meinen Programmierstil habe ich in den ersten Beitrag beschrieben. Implementiert man wirklich so? Ist alles in Ordnung und vernünftig genug?
 
Zuletzt bearbeitet:

MisterBu

Aktives Mitglied
Wenn das Programm funktioniert, ist doch alles ok. Man muß nicht immer die beste Lösung finden, eine funktionierende ist vollkommen ausreichend. Das klappt beim ersten größeren Projekt übrigens oft nicht.
Also sei doch zufrieden und sonne dich in deinem Erfolg. :)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
T User Verwaltung mit JPA Allgemeine Java-Themen 2
eskimo328 Verwaltung Kundenspezifische Einstellungen Allgemeine Java-Themen 16
N Zentrale Verwaltung von erweiterbaren Konfigurationen? Allgemeine Java-Themen 5
S Pfad Verwaltung Allgemeine Java-Themen 3
B Sehr großen Graph mit Verbindungen bauen und minimieren? Allgemeine Java-Themen 35
javamax2000 Sehr sonderbares Verhalten Allgemeine Java-Themen 6
B Welcher Datentyp für sehr große Zahlenbereiche? Allgemeine Java-Themen 1
P Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 5
R JDK installieren OpenJDK-Aufruf sehr langsam Allgemeine Java-Themen 4
Thallius String erzeugen sehr langsam Allgemeine Java-Themen 16
S JNLP startet seit 1.8.0_31 sehr langsam + Windows-Systemverzeichnis Allgemeine Java-Themen 3
Creylon Java verursacht sehr starkes ruckeln Allgemeine Java-Themen 5
N Bin to Dez und umgekehrt mit sehr großen Zahlen Allgemeine Java-Themen 2
T Gleiche Operation dauert teilweise sehr lange Allgemeine Java-Themen 12
M Externe Jar sehr langsam Allgemeine Java-Themen 23
M JUnit & Multithreading - sehr seltener Fehler Allgemeine Java-Themen 3
H Sehr viele Threads effizient Verwalten Allgemeine Java-Themen 13
J Laden von JAR Files geht ohne ADMIN Rechte sehr langsam Allgemeine Java-Themen 6
H Kopieren sehr langsam Allgemeine Java-Themen 5
B Cipher.getInstance Aufruf sehr langsam Allgemeine Java-Themen 2
nrg Arbeiten mit sehr großen CSV Dateien Allgemeine Java-Themen 20
K replaceAll bei sehr großen String Allgemeine Java-Themen 3
B Eingabemaske Komponenten aktivieren, funktionert nicht (sehr kurios) Allgemeine Java-Themen 2
hdi Heap Sapce Error bei sehr großem String Allgemeine Java-Themen 5
G RXTX library braucht sehr lange zum laden. Ist das normal? Allgemeine Java-Themen 8
L Java 1.5 - Anwendung unter 1.6 JRE sehr langsam geworden Allgemeine Java-Themen 8
O Speicherverbrauch von Java / VM sehr hoch? Allgemeine Java-Themen 27
M Rechnen mit sehr kleinen Zahlen Allgemeine Java-Themen 8
G Lesen von sehr großen dateien Allgemeine Java-Themen 8
M String zusammensetzen->sehr langsam Allgemeine Java-Themen 3
G Sehr sehr merkwürdige Ereignisse mit Fibonacci Programm Allgemeine Java-Themen 6
G Sehr gutes Java-Framework(Gui-Builder) auf XML-Basis gesucht Allgemeine Java-Themen 21
E String.replace für (sehr) großen Text Allgemeine Java-Themen 9
T [SVNKit] Commit sehr langsam. Allgemeine Java-Themen 7
G Arraylist statt List - Sehr schlimm? Allgemeine Java-Themen 8
F JAVA Applikationen starten sehr langsam Allgemeine Java-Themen 14
D Datei öffnung sehr langsam Allgemeine Java-Themen 17
G Neue Warenwirtschaft aber sehr langsam! Allgemeine Java-Themen 3
H Entpacken sehr langsam Allgemeine Java-Themen 10
Bleiglanz Benchmarks sind sehr schwierig Allgemeine Java-Themen 2
H Best Practice zu vielen konstanten Objekten? Allgemeine Java-Themen 10
M Klassen in vielen Jars ermitteln Allgemeine Java-Themen 2
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Stresstest mit seeehr vielen Clients? Allgemeine Java-Themen 21
S Aufruf in Konsole mit beliebig vielen Argumenten? Allgemeine Java-Themen 18
P Vector in vielen Klassen Allgemeine Java-Themen 21
M Problem beim laden von vielen Bildern Allgemeine Java-Themen 16
G Panel mit vielen Komponenten verbraucht viel Speicher Allgemeine Java-Themen 3

Ähnliche Java Themen

Neue Themen


Oben