MySQL Lesen und schreiben von großen Datenmengen

Java-san

Neues Mitglied
Hallo,

ich fall gleich mal mit der Tür ins Haus.

Ich arbeite zur Zeit an einem Programm, welches viele Datenbankoperationen ausführen muss. Zum Beispiel muss ich sichergehen, dass Werte in einer bestimmten Spalte einzigartig sind. Ich löse dies momentan so, dass ich mir die Daten der Spalte durch ein Select-Statement aus der Datenbank ziehe und im Speicher aufbewahre. Das funktioniert ganz gut und es ist relativ schnell nur habe ich das Problem, dass mit steigener Datensätze auch der Bedarf an Speicher steigt. Das ist mein erstes Problem.

Mein zweites Problem ist das ich gleichzeit auch viele neue Datensätze schreiben muss und somit die Tabelle und die Daten im Speicher aktualisieren muss (es ist einfach keine schöne Lösung meiner Meinung nach).

Es handelt sich hier um ca. 600 000 Datensätze die in einer XML-Datei vorliegen. Wenn ich also von Null anfange das heißt die Tabelle komplett lösche und mein Programm starte muss ich 1. 600 000 mal Datensätze in die Datenbank schreiben.
2. sicherstellen das gewisse Werte (z.b. Name) in diesen 600 000 Datensätzen einzigartig sind. Ich muss also 600 000 mal überprüfen ob der Name bereits verwendet wird. Und dann wie gesagt
3. den Bestand der tatsächlich in der Tabelle steht mit meinen Daten im Speicher synchronisieren.

Ich hoffe ich habe den Sachverhalt einigermaßen verständlich erläutert.

Meine Frage an euch ist einfach. Gibt es in Java effiziente Möglichkeiten solche Aufgaben schnell und möglichst Ressourcen-sparend zu lösen?

Bin leider ein relativer Java-Neuling. Sowas wie Bulkinserts allerdings kenne ich bereits kann ich allerdings nur (zumindest mein jetziger Wissensstand) bedingt gebrauchen.

Ich freue mich auf eure Antworten
 
Die Datenbank ist der einzige Punkt Deiner Anwendung, wo alle Daten zusammenlaufen. Dort musst du für die Durchsetzung der Constraints sorgen. Ein Zwischenpuffern im Speicher ist auf Dauer sicher nicht performant und außerdem sehr fehleranfällig (Hast du bspw. Mehrfachzugriff bedacht?). Deswegen zu:
2. sicherstellen das gewisse Werte (z.b. Name) in diesen 600 000 Datensätzen einzigartig sind.
Benutze einen UNIQUE-Constraind beim erstellen der Tabelle. Wenn du dann versuchst, einen Namen doppelt zu vergeben, verhindert das die Datenbank.
3. den Bestand der tatsächlich in der Tabelle steht mit meinen Daten im Speicher synchronisieren.
Verzichte auf dieses Konstrukt mit Deinem Speicher. Sammele Daten, bau Deine Statements, setzte sie auf die Datenbank ab. Nicht mehr nicht weniger.
1. 600 000 mal Datensätze in die Datenbank schreiben.
Das hört sich nicht übermäßig viel an. Kann man mit plain JDBC und einfachen Inserts machen. Evtl. hast Du auch Lust, ein (JPA-)Persistenz-Framework wie Hibernate oder EclipseLink zu verwenden
 
Ein UNIQUE-Constraint wäre eine Lösung. Aber bei steigender Tabellengröße steigt
auch die Dauer eines Insert. (UNIQUE-Constraint muss über mehr Daten geprüft werden.

Hatte ähnliche Problemstellung, waren aber 5 Attribute die als doppelt erkannt sollten.
Vielleicht funktioniert es bei einen Attribut noch rel. schnell.

Eine mögliche Lösung: Suche nach doppelten Namen nach dem Import.
d.h.:
- Abfrage von Teilmengen möglicher Doppelfälle (Index oder Teilindex auf das betreffende Feld)
z.B. Alle Namen die mit "Schu" anfangen. Ergibt bei insges. 600000 DS vielleicht 1000 DS.

EDIT: Bei 2 Anfangsbuchstaben = 26 * 26 Abfragen auf Teilmengen (kann ev. noch eingeschränkt werden)

- Diese kannst du dann programmatisch nach Doppelfällen durchsuchen.
 
Zuletzt bearbeitet:
Ein UNIQUE-Constraint wäre eine Lösung. Aber bei steigender Tabellengröße steigt
auch die Dauer eines Insert. (UNIQUE-Constraint muss über mehr Daten geprüft werden.
Ja und? Ich kann mir nicht vorstellen, dass man die Funktionalität in Java auch nur annähernd so performant nachgebaut bekommt.
 

Zurück
Oben