JDBCWriterPattern
JDBCWriterPattern パターンは、JDBC 接続を使用してデータベースにデータを書き込むために使用されます。
サポートされるクラス
- JDBCWriter
- LocalJDBCWriter
必須プロパティー
プロパティー名 | 値 | LocalJDBCWriter | JDBCWriter |
---|---|---|---|
PATTERN_IMPL_CLASS | JDBCWriterPattern インターフェースを実装するクラス | 該当あり | 該当あり |
ds_jndi_name | データ・ソース JNDI 名。 | 該当あり | 該当なし |
jdbc_url | JDBC の URL。例えば、jdbc:derby:C:¥¥mysample¥¥CREDITREPORT です。 | 該当あり | 該当なし |
jdbc_driver | JDBC ドライバー。例えば、org.apache.derby.jdbc.EmbeddedDriver です。 | 該当あり | 該当なし |
user_id | データベースのユーザー ID。例えば、Myid です。 | 該当あり | 該当なし |
pswd | ユーザー・パスワード。例えば mypwd などです。LocalJDBCReader 専用です。 | 該当あり | 該当なし |
オプション・プロパティー
プロパティー名 | 値 | 説明 | LocalJDBCReader | JDBCWriter |
---|---|---|---|---|
debug | true または false (デフォルトは false) | このバッチ・データ・ストリームに対する詳細トレースを使用可能にします。 | 該当あり | 該当あり |
EnablePerformanceMeasurement | true または false (デフォルトは false) | GenericXDBatchStep を使用している場合に、バッチ・データ・ストリームおよび processRecord メソッドに費やされた合計時間を計算します。 | 該当あり | 該当あり |
EnableDetailedPerformanceMeasurement | true または false (デフォルトは false) | バッチ・データ・ストリームの各メソッドで費やされた時間のより詳細な明細を提供します。 | 該当あり | 該当あり |
batch_interval | デフォルト値は 20 です。この値は、レコード・ベースのチェックポイント操作のチェックポイント間隔より小さな値に設定してください。 | バッチ処理後にコミットする SQL 更新の数を示します。 | 該当あり | 該当あり |
インターフェース定義
public interface JDBCWriterPattern {
public void initialize(Properties props);
/**
* This is typically an Update query used to write data into the DB
* @return
*/
public String getSQLQuery();
/**
* The parent class BDSJDBCWriter creates a new preparedstatement and
* passes it to this method. This method populates the preparedstatement
* with appropriate values and returns it to the parent class for execution
* @param pstmt
* @param record
* @return
*/
public PreparedStatement writeRecord(PreparedStatement pstmt, Object record);
}
JDBCWriter xJCL の例
<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 の例
<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>
JDBCWriterPattern でのスキップ・レコード処理
JDBCWriter/LocalJDBCWriter が スキップ・レコード処理で使用されるときは、特殊なケースとなります。ライターは、一連の SQL ステートメントをバッチ処理し、それらのステートメントをすべて一度にデータベースに対して実行し、実行時に問題が発生した場合は単一の BatchUpdateException をスローするというように機能します。一般的なスキップ・レコード処理の細分度に合わせるため、単一の BatchUpdateException の解析では、どのステートメントの実行がどのような例外で失敗したのかを判別し、また、ライターに渡された個々の対応するレコードを判別するよう試みられます。
例えば、10 個のレコードが 1 つのバッチになっていて、レコード #2 に対してユーザーの JDBCWriterPattern が SQL ステートメントを生成し、その結果が java.sql.SQLIntegrityConstraintViolationException になり、レコード #9 では、対応する SQL ステートメントの結果が java.sql.DataTruncation になるとします。
- スキップ・ハンドラー・メソッド onSkippedWrite(Object o, Throwable t) を、一度、レコード #2 と SQLIntegrityConstraintViolationException インスタンスを渡して呼び出します。
- スキップ・ハンドラー・メソッド onSkippedWrite(Object o, Throwable t) を、2 回目は、レコード #9 と DataTruncation インスタンスを渡して呼び出します。
- スキップ・カウントを 2 増やします (両方の例外が明示的または暗黙的にインクルード・リストに含まれていると想定しています)。
包含されている一連のステートメントの、チェーニングされた SQLException を抽出する BatchUpdateException 解析処理は、異なる JDBC ドライバー間および構成間で標準化されていません。さらに、一部のドライバーは、最初に障害が起こった時点で、バッチ全体を実行することなく異常終了します。
ご使用のドライバー構成 (一部のドライバーでは、構成が異なると、この領域での振る舞いが異なります) が実行するバッチ実行スタイルがアトミック なのか非アトミック なのかに注意してください。一般的に、アトミック・スタイルの場合はバッチ実行は最初に障害が起こった時点で異常終了し、非アトミック・スタイルの場合はバッチの残りの部分が実行されます。
アトミック・スタイルの場合、ランタイムはステップ実行ループを打ち切ります (現行トランザクションをロールバックして例外をスローします)。この場合には、実行されなかったステートメントのレコードに関連する意味のある例外はありません。それらのレコードは実行されることがないため、スキップされることもありません。
非アトミック・スタイルの場合、ランタイム・ヒューリスティックの使用によって、チェーニングされた SQLException を確認して BatchUpdateException が切り離されます。また、バッチ実行中にエラーになったステートメントが判別され、それが元の対応するレコードにマップされます。その際、対応するレコードおよび対応するチェーニングされた SQLException を指定してスキップ・リスナーが呼び出されます。 さらに、バッチ全体に対して一度だけ増分するのではなく、バッチ内の例外が発生した各レコードに対して一度ずつスキップ・カウントが増分されます。
このマッピングを作成できない場合 (非アトミック・スタイルの場合) で、かつ、スキップ・リスナーが構成されている場合、ランタイムは問題レコードごとにスキップ・リスナーを一度ずつ呼び出しますが、最上位の BatchUpdateException を渡して呼び出します。このマッピングを作成できず、スキップ・リスナーが構成されていない場合、ランタイムは例外をスローすることによって、ステップ実行ループを打ち切ります。