2016-04-15 9 views
0

Meine Java-Anwendung liest Zeilen aus einer CSV-Datei und legt sie in eine Datenbank (Apache Derby). Ich möchte Stapeleinfügungen implementieren, weil ich Tausende von Datensätzen einfüge, also möchte ich eine Leistungsverbesserung. Wie die Daten eingefügt werden, hängt jedoch von den Daten ab, die sich bereits in der Datenbank befinden, z. Ich Batch wollen den folgenden Einsätzen:Batch-Einfügung, wenn die Einfügung von Daten abhängig ist, die zur Stapelung bereit sind

INSERT INTO user (name) VALUES (?); 

Aber dann führe ich nur die oben wenn der unten keine Daten zurückgibt:

SELECT * FROM user WHERE name='Tim'; 

Wenn ich batching Einsätze bin, dann meine SELECT kann nicht finde die aktuellsten Daten, da sie darauf warten, in den Batch-Modus zu gelangen.

Kann jemand eine Lösung identifizieren? Vielleicht ein Caching-Mechanismus?

Antwort

1

Eine einfache Option wäre, Ihre Batch-Einträge INSERT/SELECT-Anweisungen, so dass Einfügungen nur passieren, wenn die Bedingung der Abfrage erfüllt ist.

dass so etwas wie sein: Diese erhalten die Datenbank zu behandeln prüft wird, ob der Datensatz eingefügt wird existiert oder nicht

Lists<String> usernames = new ArrayList<>(); 
//.... data in list assumed 
for(String username: usernames) { 
    statement.addBatch("INSERT INTO USER(NAME) SELECT '" + username+ "' FROM USER WHERE NOT EXISTS(SELECT 1 FROM USER WHERE NAME = '" + username + "')"); 
} 

. Jede Anweisung, für die eine Entsprechung bereits in der Datenbank vorhanden ist, wird einfach nicht eingefügt, und die Rückgabezahl für sie wird 0. Aber Sie würden sich trotzdem nicht darum kümmern.

Ich googelte schnell und sah, dass Derby anscheinend die INSERT/SELECT-Funktion unterstützt. Sie können mehr über diese Syntax hier finden: https://db.apache.org/derby/docs/10.0/manuals/reference/sqlj40.html