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 | 数据库的用户标识。例如,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 在用于跳过记录的处理时表示一个特殊案例。写程序通过对 SUL 语句序列进行批处理并针对一个数据库一次执行所有这些语句来运作,如果执行时发生问题,那么这将抛出一个 BatchUpdateException。要匹配常规跳过记录处理的粒度,尝试解析单个 BatchUpdateException 以确定针对哪些异常,哪些语句执行失败,以及将哪些单个和相应的记录传递给写程序。
例如,如果具有一批 10 个记录,针对记录 #2,用户的 JDBCWriterPattern 生成导致 java.sql.SQLIntegrityConstraintViolationException 的 SQL 语句,针对记录 #9,相应 SQL 语句生成 java.sql.DataTruncation。
- 调用一次跳过处理程序方法 onSkippedWrite(Object o, Throwable t),此方法传递记录 #2 和 SQLIntegrityConstraintViolationException 实例。
- 第二次调用跳过处理程序方法 onSkippedWrite(Object o, Throwable t),此方法传递记录 #9 和 DataTruncation 实例。
- 增加跳过计数,增加幅度为 2 次(假定这两个异常都显式地或隐式地属于包含列表的一部分)。
解析 BatchUpdateException 的过程为截取链式 SQLExceptions,因为未跨 JDBC 驱动程序和配置标准化包含的语句。此外,第一次发生故障而无法执行完整批处理时,某些驱动程序会异常中止。
请留意您的驱动程序配置(在此区域中,某些驱动程序行为跨不同配置会不同)是执行原子还是非原子批处理执行样式。通常,针对原子样式,批处理执行会在第一次发生故障时异常中止,而对于非原子样式,则会执行剩余批处理。
如果是原子样式,那么运行时会异常中止步骤执行循环(抛出回滚当前事务的异常)。在此示例中,没有与未执行的语句记录关联的有意义的异常。由于它们从未执行,因此未跳过。
如果是非原子样式,那么会使用运行时启发式来拆散 BatchUpdateException,同时查看链式 SQLException。它会尝试确定批处理执行中的哪些语句导致了错误,并将其映射回相应记录,同时使用相应记录和相应链式 SQLException 调用跳过侦听器。 它还会针对每个记录增加一次跳过计数,而不是针对整个批处理仅跳过一次,这会导致批处理中发生异常。
如果无法执行此映射(针对非原子样式),且已配置跳过侦听器,那么运行时会针对每个问题记录调用跳过侦听器一次,但是调用方式是通过传递顶级 BatchUpdateException。如果无法执行映射,且尚未配置跳过侦听器,那么运行时会通过抛出异常来异常中止步骤执行循环。