PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RDBMS-like Datenstrukturen in Java


Captain America
2002-11-05, 10:27:11
HALLO PROFIS!!!!!!!!1

Jeder von euch der schon mal ein Programm geschrieben hat, das mit vielen Daten arbeitet, weiss sicherlich wie genial die Speicherung in einer RDBMS sein kann, und wie genial man diese Daten wieder herausholen kann.

Aber was ist, wenn man keine RDBMS nutzen kann? Wie speichert man da am besten seine komplexen Datenstrukturen ab? Meine Idee ist, das ich ein Objekt pro Struktur ("Tabelle") mache. In einem erdachten Szenario mit 2 Tabellen (CPU und Hersteller) könnte z.B. CPU die Tabelle Hersteller referenzieren, und es gäbe die Klassen CPU und Hersteller.

Ich könnte jetzt sicher eine Klasse schreiben, die auf einer fixen Definition beruht, und mit int's als Primärschlüsseln arbeitet. Das klingt erst mal OK für ein kleines Projekt, ist aber kaum skalierbar. Es würde für jede "Tabelle" eine funktion zum erstellen, löschen etc geben.

Find ich aber nicht soooo toll. Habt ihr andere Ideen, wie man sowas lösen kann? Alles ausser flat files bitte! ;)

grakaman
2002-11-05, 11:57:50
dein denkansatz versteh ich nicht recht. wie willst du denn daten in einem objekt speichern? das wäre ja davon abhängig, ob dein programm ausgeführt wird oder nicht. wenn dir kein rdbms zur verfügung steht, speicher das ganze doch als xml-file ab.

mfg

Captain America
2002-11-05, 13:29:29
class CPU
{
public int cpuId;
public String name;
public int MHz;
public int herstellerId;
}



class Hersteller
{
public int herstellerId;
public String name
}


Stell dir vor, 100 CPU-Objekte in einem Array oder Vector, und 10 Hersteller-Objekte in einem anderen.

Sinn ist, Daten nicht redundant zu speichern. Es ist ausserdem schneller, in einem Array aus CPU-Objekten nach einem int zu suchen, als nach einem String.

Wie in einer RDBMS. Die Persistenz spielt erst mal keine Rolle.

Verstehen?

grakaman
2002-11-05, 15:34:46
das kommt ganz darauf an, wieviel daten du speicherst und wie oft du darauf zugreifen willst. auch bei einem rdbms musst du deine daten ja im programm speichern, also in variablen/felder. du kannst auch tausend records machen und sie permanent im speicher behalten, nur wird dein speicher davon ziemlich vollgemüllt. bei überschaubarer menge mags ja noch gehen. deshalb würde ich, wenn du das so machen willst, daten, die du nicht oft brauchst, zb. in xml speichern und bei bedarf ein objekt deiner tabellenklassen instanzieren und die felder dann aus der xml datei füllen.

mfg

Captain America
2002-11-05, 15:46:23
Es handelt sich um einige 1000 "Datensätze" à 1-2 kB, die auch permanent im Speicher bleiben sollten, weil sie zur Laufzeit permanent gebraucht werden. XML DOM ist vielleicht eine Alternative, aber ich weiss nicht wie der Speicher sich verhält im Vergleich zu meiner Idee. SAX scheidet aus, ich kann es mir nicht leisten, jedes mal SAX zu starten.

Ich muss bei jedem Einfügen eines Datensatzes prüfen, ob er schon existiert (Unique).

XML DOM scheint mir da zu viel Overhead zu haben, weil es ja ein Text parser ist, und er Text anstatt int's vergleicht - und ich weiss nicht ob er das mit dem Unique per DTD unterstützt. Meinungen dazu? Für persitenz ist XML (gezippt) aber gut geeignet.

Worauf ich mit meiner Frage ursprünglich gezielt hatte: Gibt es einen RDBMS-like Ersatz für Java-Apps?

grakaman
2002-11-05, 18:54:32
na ist das programm clientseitig oder serverseitig? also serverseitig musst du schon aufpassen. selbst, wenn das vielleicht bloss paar kb an daten sind, sobald viele nutzer gleichzeitig zugreifen, kann das schon viel speicher fressen. aber sonst kannst du natürlich mit arrays arbeiten. ob du das ganze dann in klassen organisierst oder ne hat ja eigentlich weniger mit dem problem was zu tun.

mfg

Captain America
2002-11-05, 20:53:41
Originally posted by grakaman
na ist das programm clientseitig oder serverseitig? also serverseitig musst du schon aufpassen. selbst, wenn das vielleicht bloss paar kb an daten sind, sobald viele nutzer gleichzeitig zugreifen, kann das schon viel speicher fressen. aber sonst kannst du natürlich mit arrays arbeiten. ob du das ganze dann in klassen organisierst oder ne hat ja eigentlich weniger mit dem problem was zu tun.

mfg

Stand-Alone, kein Server-Client-Szenario. Es greifen mehrere Threads auf die Quellen zu. Das Problem mit der synchronisation ist sehr einfach zu lösen in Java, also kein Problem.

Ob das ganze in Klassen organisiert ist, ist schon das Problem, ich will ja wissen ob es anders besser gemacht werden kann! ;)

Marcel
2002-11-07, 14:05:06
Da fallen mir spontan zwei Möglichkeiten ein:
a) JDBC (Java Database Connectivity oder so)
b) J2EE (Java To Enterprise Edition)

a) ist eine reine Schnittstelle zur Datenbank, ähnlich wie ODBC; da kansnte dann alle DBMS, die 'nen JDBC-"Treiber" anbieten, drunterhauen.

b) ist wahrscheinlich mit Spatzen auf Kanonen geschissen, ist für fette serverseitige Anwendungen. Lange Einarbeitungszeit (trotz gutem Tutorial von Sun), musst den Java Enterprise Server bei dir laufen lassen. Mit weniger als 256 MB RAM wirst Du alt (Tippfehler korrigieren => neu deployen => angucken: 7-8 Minuten bei 128 MB RAM, 20-30 Sekunden bei 256 MB). Hierbei hast Du, grob gesagt, Deine Objekte, die Du anhand der ID aufrufst. J2EE kümmert sich darum, dass die ordnungsgemäß in der DB landen, daraus geholt werden, um Transaktionsmanagement, Persistenz und so weiter. Ein eigenes DBMS mit einem SQL-Dialekt, der an Aggressionspotenzial bei der Einarbeitung schon fast an MS-SQL herranreicht, wird mitgeliefert (Cloudscape genannt). Theoretisch kannst Du in jedem beliebigen Moment den DoubleX-Button an der Frontseite Deines Rechners drücken, ohne das auch nur ein Byte Daten verloren geht; praktisch habe ich auch noch nichts Gegenteiliges gehört.

So, wie sich das anhört, bist Du mit einem guten DBMS per JDBC besser bedient.

Gruß,
Marcel

Unregistered
2002-11-09, 16:09:12
Hast hier schon mal nachgeschaut...
http://jakarta.apache.org
Die Jungs und Mädels haben für (fast) alles eine Lösung!

Für Dich dürfte OJB ObjectRelationalBridge interessant sein.
Ist mir gestern übern Weg gelaufen, hab´s aber noch nicht benutzt!

Gruß

hacki

Unregistered
2002-11-26, 13:41:29
Das wird ziemlich schwierig, also mal kurz was geschrieben ist da nicht.

Du koenntest mit einer Kombination aus HashMaps und ArrayLists dir sowas aufbauen. Aber das ist nicht gerade einfach, kann dafuer aber bei guter Programmierung sau schnell sein.

Du haettest auch den Vorteil, dass du durch OBjectSerialization oder XML-Serialization diese Datenstruktur ganz einfach persistent speichern.

Und mit JDO gibts nen einheitlichen Standard um auf Datenbanken, Dateien und eventuell Datenstrukturen zugreifen kannst. Ist noch sehr neu, vor allem kannst du dann ganz einfach ne Datenstruktur gegen eine Datenbank austauschen.


mfg Senior Sanchez