2012-07-02 12 views
15

Ich führe jedes Mal, wenn mein Programm ausgeführt wird, einen JDBC-Batch-Einfügevorgang durch (Einfügen von jeweils etwa 1000 Zeilen). Aber ich bin nicht in der Lage, die Ausnahme zu behandeln, die von einigen der Datensätze richtig ausgelöst wird.JDBC Batch-Insert-Ausnahmebehandlung

Angenommen, der 100. Datensatz von 1000 Datensätzen gibt eine Ausnahme aus, weil ungültige Daten oder die Größe eines Werts die Spaltengröße überschreitet. Sobald die Ausnahme aufgetreten ist, die verbleibenden Datensätze werden nicht eingefügt und das Programm schlägt dazwischen.

Was ich will ist, selbst wenn der 100. Datensatz Ausnahme wirft, sollten die restlichen Einfügungen wie üblich geschehen, bevor mein Programm endet.

Ich bin nicht in der Lage zu verstehen, wie dies zu erreichen ist. Bitte vorschlagen.

EDIT:

Hier ist ein Beispielcode ich in meiner App für Masseneinfügemodus verwenden. Angenommen, die Ergebnismenge hat ca. 1000 Datensätze.

PreparedStatement ps = null; 
while(rs.next()){ 
    //Retrieve the value and set it to a Prepared statement 

    String name = rs.getString("Name"); 
    int age = rs.getInt("Age"); 
    ps.setInt(1, age); 
    ps.setString(2, name); 

    //Finally invoke addBatch 
    ps.addBatch(); 
} 

//Finally call the executeBatch method 
ps.executeBatch(); 

Wenn der 100. Rekord eine Ausnahme wirft, dann will ich nur von dem 100. zu 1000. Rekord, den Prozess auszulösen. Gibt es eine Möglichkeit, dies zu tun, so dass ich den Prozess von dem Datensatz neu starten kann, der Ausnahme und bis zum Ende wieder warf? Wie erreiche ich das?

+2

Und Ihr Code ist? – Alfabravo

Antwort

0

Ohne Code zu sehen, ist der beste Rat, den ich geben kann, ist, einen try/catch-Block um den Code zu legen, der das Einfügen durchführt. Wahrscheinlich müssen Sie Ihre Einsätze (bei Transaktionsverbindung) auch bei jeder Einfügung festlegen. Dies führt zu einer etwas langsameren Verarbeitung, ermöglicht jedoch, dass Ihr Programm fortgesetzt wird.

Ich denke, ein sauberer Ansatz wäre, zu versuchen, die Datensätze vor dem Einfügen zu validieren. Dies sollte nicht zu viel Verarbeitungslast sein, wenn wir nur über 1000 Datensätze gleichzeitig sprechen.

+0

irgendwelche Vorschläge/Hilfe zu meinem ursprünglichen Beitrag? – user182944

25

Sie geben an, dass Sie Stapel von SQL-Anweisungen ausführen, also nehme ich an, dass Sie executeBatch verwenden. Wenn Sie einen Stapel von Anweisungen executeBatch, einige der Anweisungen möglicherweise erfolgreich sind und einige der Anweisungen möglicherweise fehlschlagen. Wenn eine Anweisung fehlschlägt, bedeutet dies nicht, dass der JDBC-Treiber die erfolgreichen Anweisungen zurücksetzt. Der JDBC-Treiber kann versuchen, alle Anweisungen im Stapel auszuführen, wenn eine Anweisung fehlschlägt oder die Ausführung von Anweisungen im Stapel nach dem Fehlschlagen einer Anweisung beendet wird (es klingt so, als ob der verwendete Treiber die Ausführung von Anweisungen stoppt) sobald es einen Fehler gibt). Wenn eine Anweisung in einem Stapel fehlschlägt, sollten Sie eine BatchUpdateException erhalten. In Ihrem Ausnahmebehandler müssen Sie getUpdateCounts aufrufen. Dies gibt Ihnen ein Array von int, die Ihnen entweder angibt, wie viele Zeilen die Anweisung aktualisiert hat, eine Statement.SUCCESS_NO_INFO, die angibt, dass die Anweisung erfolgreich war, aber keine Zeilenanzahl verfügbar war, oder Statement.EXECUTE_FAILED, die angibt, dass die Anweisung fehlgeschlagen ist. Wenn die ersten 99 Anweisungen erfolgreich sind, generiert die 100. Anweisung einen Fehler, und die verbleibenden Anweisungen werden nicht ausgeführt. Sie sollten ein Array mit 100 Elementen abrufen, wobei die ersten 99 Elemente den Erfolg anzeigen und das 100. Element Statement.EXECUTE_FAILED angibt. Ihr Code müsste dann die Anweisungen wiederholen, die nicht ausgeführt wurden (in diesem Fall die Anweisungen 101-1000).

+0

irgendwelche Vorschläge/Hilfe auf meinem ursprünglichen Beitrag? – user182944