JDBC-Stapelaktualisierungsproblem

8

Ich habe eine etwas einzigartige Anforderung mit der Java-JDBC API zusammen mit Oracle Database. Ich habe autoCommit, um Standard zu sein, was für Oracle wahr ist, und ich verwende das Beispiel ähnlich zu diesem Link .

Wenn ich jedoch 1000 Chargen addiere, können wir sagen, dass es sich jeweils um Inserts handelt. Und nehmen wir an, dass etwa 20 Datensätze gegen einige Einschränkungen verstoßen, ich möchte, dass die verbleibenden 980 COMMITTED (und fortan für alle anderen Abfragen mit anderen Verbindungen sichtbar) zur Datenbank gehen und die 20 Datensätze ignorieren. Wenn im obigen Beispiel eine Zeile gegen eine Transaktion verstößt, dann , auch wenn ich im catch-Block festlege, wird die Transaktion nur bis zum ersten Fehler festgeschrieben .

Ich weiß Batch-Updates sind NUR durchzuführen, wenn Sie ziemlich sicher sind, dass alle Zeilen durchlaufen werden und die Ausnahmeverarbeitung keine ist, aber ich plane, eine existierende Datenbank zu PATCHEN, damit eine Art von "schlechten Praktiken" in Ordnung ist Codebeispiele werden sehr geschätzt.

**** MEHR DETAILS ****

Die Verwendung der einfachen Einfügung / Aktualisierung ist nicht in Ordnung, da ich in der Nähe von 3M-Reihen binde, so dass alle 1000 Datensätze stapelweise verarbeitet werden. Das einfache Hinzufügen von 1000 Einfügungen in eine Schleife (Ignorieren von Ausnahmen) benötigt viel mehr Zeit (etwa 5 Sekunden für jeweils 1000 Datensätze) im Gegensatz zu der Stapelaktualisierung & lt; 300ms.

Problem: Bei der Oracle-Datenbank scheint der Treiber beim ersten FAILURE zu stoppen, dh wenn 1000 Zeilen gestapelt sind und der 100. fehlgeschlagen ist, möchte ich, dass es bis zur 1000. Zeile weitergeht. Ich denke, dass dies in JDBC (mit Oracle) nicht möglich ist. Wie der Link zeigt nur wenige Datenbanken an solche Funktion und wahrscheinlich ist Oracle nicht eins

    
Kannan Ekanath 29.05.2009, 08:33
quelle

7 Antworten

1

Ich suchte eine Lösung auf der Linie von "Mit Oracle-Datenbank scheint der Treiber beim ersten FAILURE zu stoppen, dh wenn 1000 Reihen gestapelt sind und 100. fehlgeschlagen ist, will ich, dass es bis zur 1000. Reihe weitergeht." Grundsätzlich wollte ich wissen, ob dies mit Oracle JDBC-Treiber getan werden kann.

Es wurde jedoch eine Vielzahl von Antworten vorgeschlagen (die meisten / alle, die ich bereits berücksichtigt hatte) 1) Deaktivieren der Einschränkungen / Laden von Daten / Entfernen von störenden Zeilen / Wiederholen Sie dies viele Male 2) Führen Sie alle Überprüfungen durch, bevor Sie Daten laden 3) Verringern Sie die Stapelgröße auf 50 - 100.

Leider kann meine Überprüfung nicht vor dem Laden durchgeführt werden und die Batchgröße auf 50 oder 100 zu stellen bedeutet, dass ich mehr Zeit für die 5M Zeilen benötige (tatsächlich ist die Gesamtzeit auf einige Stunden anstatt 40 Minuten mit einer Batchgröße von 1000). Ich habe darauf geachtet, die Batch-Größe von 1000 ACCEPTING THE Problem wie und legen Sie den Code unter eine "while" -Schleife und machen Sie den Job, bis wir alle Zeilen füllen.

Wie ich schon sagte, da es NO WAY MIT ORACLE BATCH JDBC gibt, um nach dem ersten Fehler fortzufahren, lautet die Antwort auf diese Frage "NICHT DOABLE" und akzeptiert nur die Einschränkungen und dokumentiert die Tatsache, dass Dieses Tool benötigt ca. 40 Minuten:)

    
Kannan Ekanath 01.06.2009, 11:14
quelle
3

Sie können eine gespeicherte PL / SQL-Prozedur mit der SAVE EXCEPTIONS-Klausel verwenden, mit der Sie eine Massenaktualisierung durchführen und dann die Zeilen zurückgeben können, die nicht aktualisiert werden konnten. Hier ein paar Beispiellinks:

Ссылка

Ссылка

    
Martlark 29.05.2009 09:34
quelle
2

Sie sollten in eine funktionierende Tabelle einfügen, die keine Einschränkungen hat, dann löschen oder korrigieren, was in Verletzung wäre, und INSERT SELECT den Rest in einer einzigen SQL-Anweisung in die reale Tabelle einfügen.

    
Thilo 29.05.2009 10:52
quelle
1

Sie könnten dies versuchen: Beginnen Sie mit Chargen von 50 oder 100. (Wählen Sie eine Größe, damit sie eine gute Wahrscheinlichkeit haben, erfolgreich verarbeitet zu werden). Diejenigen, die scheitern, werden einzeln bearbeitet.

Andere Möglichkeit: Deaktivieren Sie die Abhängigkeiten, laden Sie die Daten, löschen Sie die Zeilen, die die Einschränkungen verletzen.

    
Erich Kitzmueller 29.05.2009 09:21
quelle
1

Ich sollte zuerst prüfen, ob es eine Constraint-Verletzung gibt, dann diesen Datensatz einfügen, wenn die Contraints nicht verletzt werden.

    
Salandur 29.05.2009 09:47
quelle
1

Könnten Sie die Oracle-Anweisung "Zusammenführen wenn nicht übereinstimmend" ausprobieren? Beispiel: Ссылка

    
russoue 07.06.2012 23:52
quelle
0

Halten Sie eine Ausnahmetabelle und stellen Sie sicher, dass Ihr Prozess keine Ausnahme auslöst, sondern alle Ausnahmen in der Datenbank speichert. Wenn alles fertig ist, können Sie die Abfragetabellen abfragen und die Datensätze nicht durchgehen.

    
user2091897 20.02.2013 15:35
quelle

Tags und Links