JDBCWriterPattern
Das Muster "JDBCWriterPattern" wird verwendet, um über eine JDBC-Verbindung Daten in eine Datenbank zu schreiben.
Unterstützungsklassen
- JDBCWriter
- LocalJDBCWriter
Erforderliche Eigenschaften
Eigenschaftsname | Wert | LocalJDBCWriter | JDBCWriter |
---|---|---|---|
PATTERN_IMPL_CLASS | Klasse, die die Schnittstelle JDBCWriterPattern implementiert | Zutreffend | Zutreffend |
ds_jndi_name | JNDI-Name der Datenquelle. | Zutreffend | Nicht zutreffend |
jdbc_url | Der JDBC-URL, z. B. jdbc:derby:C:\\mysample\\CREDITREPORT. | Zutreffend | Nicht zutreffend |
jdbc_driver | Der JDBC-Treiber. Beispiel: org.apache.derby.jdbc.EmbeddedDriver | Zutreffend | Nicht zutreffend |
user_id | Die Benutzer-ID für die Datenbank. Beispiel: Myid. | Zutreffend | Nicht zutreffend |
pswd | Benutzerkennwort, z. B. mypwd. Nur LocalJDBCReader. | Zutreffend | Nicht zutreffend |
Optionale Eigenschaften
Eigenschaftsname | Wert | Beschreibung | LocalJDBCReader | JDBCWriter |
---|---|---|---|---|
debug | true oder false (der Standardwert ist false) | Aktiviert detailliertes Tracing in diesem Stapeldatenstrom. | Zutreffend | Zutreffend |
EnablePerformanceMeasurement | true oder false (der Standardwert ist false) | Berechnet die Gesamtzeit in den Stapeldatenströmen und in der Methode "processRecord" bei Verwendung des GenericXDBatchStep. | Zutreffend | Zutreffend |
EnableDetailedPerformanceMeasurement | true oder false (der Standardwert ist false) | Bietet eine detailliertere Aufgliederung der Zeit pro Methode des Stapeldatenstroms. | Zutreffend | Zutreffend |
batch_interval | Der Standardwert ist 20. Dieser Wert muss niedriger sein als das Prüfpunktintervall für das datensatzbasierte Prüfpunktverfahren. | Benennt die Anzahl der SQL-Aktualisierungen, die vor der Festschreibung in den Stapel gestellt werden sollen. | Zutreffend | Zutreffend |
Schnittstellendefinition
public interface JDBCWriterPattern {
public void initialize(Properties props);
/**
* Das ist normalerweise eine Abfrage für eine Aktualisierung, die verwendet
* wird, um Daten in die Datenbank zu schreiben
* @return
*/
public String getSQLQuery();
/**
* Die übergeordnete Klasse BDSJDBCWriter erstellt eine neue vorbereitete
* Anweisung (preparedstatement) und übergibt sie an diese Methode.
* Diese Methode füllt die vorbereitete Anweisung mit entsprechenden Werten
* und gibt sie zur Ausführung an die übergeordnete Klasse zurück.
* @param pstmt
* @param record
* @return
*/
public PreparedStatement writeRecord(PreparedStatement pstmt, Object record);
}
JDBCWriter-xJCL-Beispiel
<batch-data-streams>
<bds>
<logical-name>outputStream</logical-name>
<props>
<prop name="PATTERN_IMPL_CLASS" value="com.ibm.websphere.batch.samples.tests.bds.EchoWriter"/>
<prop name="ds_jndi_name" value="jdbc/fvtdb"/>
<prop name="debug" value="true"/>
</props>
<impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.JDBCWriter</impl-class>
</bds>
</batch-data-streams>
LocalJDCBWriter-xJCL-Beispiel
<batch-data-streams>
<bds>
<logical-name>outputStream</logical-name>
<props>
<prop name="PATTERN_IMPL_CLASS" value="com.ibm.websphere.batch.samples.tests.bds.EchoWriter"/>
<prop name="jdbc_url" value="jdbc:derby:C:\\mysample\\CREDITREPORT"/>
<prop name="jdbc_driver" value="org.apache.derby.jdbc.EmbeddedDriver"/>
<prop name="user_id" value="myuserid"/>
<prop name="pswd" value="mypswd"/>
<prop name="debug" value="true"/>
</props>
<impl-class>com.ibm.websphere.batch.devframework.datastreams.patterns.LocalJDBCWriter</impl-class>
</bds>
</batch-data-streams>
Verarbeitung für das Überspringen von Datensätzen mit dem JDBCWriterPattern
Der JDBCWriter/LocalJDBCWriter stellt einen besonderen Fall bei Verarbeitung für das Überspringen von Datensätzen dar. Der Writer funktioniert über die Stapelverarbeitung einer Folge von SQL-Anweisungen und die gleichzeitige Ausführung aller dieser Anweisungen für eine Datenbank. Tritt bei der Ausführung ein Problem auf, wird eine einzige BatchUpdateException ausgelöst. Es wird versucht, eine Übereinstimmung mit der Unterteilung bei der allgemeinen Verarbeitung für das Überspringen von Datensätzen herzustellen. Dazu wird eine einzelne BatchUpdateException geparst, um festzustellen, welche Ausführungen einer Anweisung fehlgeschlagen sind und welche Ausnahmen dabei ausgelöst wurden. Außerdem wird festgestellt, welche Datensätze im Einzelfall an die Writer übergeben wurden.
Wenn Sie z. B. einen Stapel mit zehn Datensätzen haben, erzeugt das JDBCWriterPattern des Benutzers für Datensatz Nr. 2 eine SQL-Anweisung, die java.sql.SQLIntegrityConstraintViolationException zur Folge hat, und für den Datensatz Nr. 5 die entsprechende SQL-Anweisung, die java.sql.DataTruncation zur Folge hat.
- Rufen Sie die Handlermethode für das Überspringen "onSkippedWrite(Object o, Throwable t)" auf, wenn Sie Datensatz Nr. 2 übergeben, und rufen Sie die SQLIntegrityConstraintViolationException-Instanz auf.
- Rufen Sie die Handlermethode für das Überspringen "onSkippedWrite(Object o, Throwable t)" auf, wenn Sie Datensatz Nr. 9 übergeben, und rufen Sie die SQLIntegrityConstraintViolationException-Instanz auf.
- Erhöhen Sie den Wert für das Überspringen um 2 (vorausgesetzt, dass beide Ausnahmen explizit oder implizit Teil der Einschlussliste sind).
Der Prozess zum Parsen einer BatchUpdateException mit dem Ziel, verkettete SQLExceptions für die enthaltenen Anweisungen zu extrahieren, ist in den JDBC-Treibern und -Konfigurationen nicht standardisiert. Außerdem brechen einige Treiber beim ersten Fehler die Verarbeitung ab, ohne den Stapel vollständig auszuführen.
Beachten Sie, ob Ihre Treiberkonfiguration (manche Treiber zeigen in verschiedenen Konfigurationen ein unterschiedliches Verhalten) den Stapel atomar oder nicht atomar ausführt. Im Allgemeinen wird die Stapelausführung beim atomaren Ansatz beim ersten Fehler abgebrochen, während beim nicht atomaren Ansatz der Rest des Stapels ausgeführt wird.
Beim atomaren Ansatz unterbricht die Laufzeit die Schrittausführungsschleife (löst eine Ausnahme aus, die dazu führt, dass die aktuelle Transaktion rückgängig gemacht wird). In dieser Instanz gibt es keine aussagefähige Ausnahme, die den Datensätzen der nicht ausgeführten Anweisungen zugeordnet werden könnte. Da sie nicht ausgeführt werden, können sie auch nicht übersprungen werden.
Beim nicht atomaren Ansatz wird eine Laufzeitheuristik verwendet, um die BatchUpdateException und die verketteten SQLExceptions zu untersuchen. Es wird versucht, festzustellen, welche Anweisungen in der Stapelausführung zu Fehlern geführt haben, und die Fehler dem entsprechenden Datensatz zuzuordnen. Dabei werden der Listener für das Überspringen von Datensätzen und die entsprechende verkettete SQLException aufgerufen. Der Wert für die Anzahl übersprungener Datensätze wird für jeden Datensatz und nicht für den gesamten Stapel um 1 erhöht, was eine Ausnahme im Stapel zur Folge hat.
Wenn diese Zuordnung nicht vorgenommen werden kann (beim nicht atomaren Ansatz) und ein Listener für das Überspringen von Datensätzen konfiguriert wurde, ruft die Laufzeit den Listener für jeden Problemdatensatz einmal auf, indem sie die BatchUpdateException auf der obersten Ebene auslöst. Wenn die Zuordnung nicht vorgenommen werden kann und kein Listener für das Überspringen von Datensätzen konfiguriert wurde, unterbricht die Laufzeit die Schrittausführungsschleife durch Auslösen einer Ausnahme.