2016-04-22 6 views
0

Kann jemand vorschlagen, wie ich Batch-Abfragen in eine Apache Derby DB einfügen und gleichzeitig doppelte Einträge mit guter Leistung behandelt?Verlieren verbleibende Batched SQL-Abfragen, wenn Duplicate Key gefunden

Als letzten Ausweg, um Leistung mit der Fähigkeit zu versuchen, doppelte Schlüssel auf INSERT zu umgehen, entschied ich JDBC/Derby sagen mir, wenn eine Batch-Abfrage in einem doppelten Schlüssel führen würde, den Fehler abfangen und dann fortfahren mit den verbleibenden Batch-Abfragen.

Leider, sobald ein Fehler erkannt wird, scheint es, den gesamten Stapel von Abfragen zu löschen, was bedeutet, dass ich alle verbleibenden Datensätze verliere.

Dinge, die ich habe versucht:

  • eine programmatische Abfrage durchführen, um zu bestimmen, ob der Eintrag bereits in dort. Dies wurde abgebrochen, da sich die Daten derzeit in einem Stapel befinden, sodass sie nicht erfasst werden.
  • Verwenden Sie SQL-Abfragen nur INSERT, wenn der Datensatz nicht bereits vorhanden ist. Dies wurde aufgegeben, weil es zu einer schrecklichen INSERT-Leistung (fast 70%) führte.
  • Lassen Sie die DB mir von doppelten Schlüsseln erzählen, fangen Sie den Fehler auf und fahren Sie fort, Stapel zu verarbeiten. Dies wird abgebrochen, da es "vergisst", dass weitere Abfragen im Stapel verarbeitet werden sollen.

Wenn nur Derby INSERT IGNORE unterstützt.

Dank

+0

betreiben Sie Derby im Embedded-Modus oder als Netzwerkserver? – wero

+0

Es wird im eingebetteten Modus ausgeführt. Es hat nur einen einzigen Benutzer - das ist die Anwendung.Es soll eine leichte temporäre Datenbank sein – jdie8274j

Antwort

2

Die JDBC says, dass es ein Treiber weiterhin Batch-Anweisungen auszuführen, nachdem ein Fehler auftritt:

Wenn einer der Befehle in einer Batch-Update richtig diese Methode ausführen fehlschlägt eine BatchUpdateException auslöst und ein JDBC-Treiber oder die verbleibenden Befehle im Stapel möglicherweise nicht weiter verarbeitet.

Nun ist das Derby docs state dass in Embedded-Modus Batch-Verarbeitung stoppt, wenn ein Fehler auftritt, während der Netzwerktreiber weiter:

Behandlung von Fehlersituationen während der Stapelverarbeitung mit java.sql angetroffen. Statement, java.sql.PreparedStatement und java.sql.CallableStatement ist anders. Mit dem integrierten Treiber Verarbeitung stoppt, wenn ein Fehler auftritt; mit dem Netzwerk-Client Treiber Verarbeitung wird fortgesetzt, aber ein entsprechender Wert wie in definiert die java.sql.Statement api wird in der resultierenden Update-Anzahl Array zurückgegeben.

Aber da Sie stattdessen einfach eine INSERT IGNORE Sie könnten ausführen möchten ein MERGEstatement verwenden, die von Derby unterstützt wird.

+0

Hallo @Wero, danke für Ihre Antwort. Schlägst du vor, dass ich die Anwendung im Netzwerkmodus ausführen und auf localhost verbinden könnte? Ich habe mir 'merge' angeschaut, aber es scheint meinen Anwendungsfall nicht zu unterstützen, da es eine Quelltabelle benötigt. In zwei meiner Tabellen füge ich aus den Anwendungsdaten und dann in meiner Nachschlagetabelle ein, die ich basierend auf Zeilen in den anderen zwei einfüge. – jdie8274j

+0

@ Jdie8274j Sie könnten den Netzwerkmodus versuchen und sehen, ob es funktioniert. Und würde nicht '(SELECT als ID FROM Dual)' arbeiten als Quellentabelle? – wero

+0

Ich glaube nicht, dass "Dual" leider von Derby unterstützt wird! Ich versuche auch, SELECT-Abfragen zu vermeiden, weil ich viele Daten einfüge, und ich möchte es schnell machen. Daher meine Enttäuschung, als ich feststellte, dass das Abfangen einer doppelten Schlüsselausnahme nicht funktionieren würde! – jdie8274j