【发布时间】:2013-04-09 14:59:35
【问题描述】:
我正在使用 ItemReader/ItemWriter 设置 Spring Batch Job,以将数据集从 Oracle DB 导出到 CSV/Excel/PDF。对于读者部分,我使用的是JdbcCursorItemReader。
默认情况下,需要将 SQL 语句传递给阅读器以提取数据集 - 这是我的阅读器配置:
<bean id="readErgebnis" class="org.springframework.batch.item.database.JdbcCursorItemReader" scope="step">
<property name="dataSource" ref="dataSource" />
<property name="sql" value="#{jobParameters['stmt']}" />
<property name="rowMapper">
<bean class="myFancyRowMapper" />
</property>
</bean>
所以我在 JobParametersBuilder 中添加了 SQL 语句...
JobParametersBuilder builder = new JobParametersBuilder();
builder.addString("stmt", sql);
应该没问题。但是,执行作业失败并显示SQLException。
现在我知道 Spring Batch 正在将所有内容记录到它的记录表中,但存在问题 - 参数字符串(包含 SQL)限制为 250 个字符。查看 BATCH_JOB_PARAMS 表的定义:
CREATE TABLE BATCH_JOB_PARAMS (
JOB_INSTANCE_ID NUMBER(19,0) NOT NULL ,
TYPE_CD VARCHAR2(6) NOT NULL ,
KEY_NAME VARCHAR2(100) NOT NULL ,
STRING_VAL VARCHAR2(250),
DATE_VAL TIMESTAMP DEFAULT NULL ,
LONG_VAL NUMBER(19,0) ,
DOUBLE_VAL NUMBER ,
constraint JOB_INST_PARAMS_FK foreign key (JOB_INSTANCE_ID)
references BATCH_JOB_INSTANCE(JOB_INSTANCE_ID)
);
Spring Batch 将每个作业参数存储在一个新行中,因此 SQL 语句进入限制为 250 个字符的 STRING_VAL 列。我检查了其他数据库系统(MySQL 和 DB2)的 DDL,似乎到处都限制为 250 个字符。我现在将该列更改为CLOB,工作正常并且我的工作运行。
我的问题:我简直不敢相信它打算通过批处理作业存储限制为 250 个字符的作业参数。那么对于我的场景是否有更好的实现,或者它是否旨在更改 BATCH_JOB_PARAMS 表中参数列的默认值?
【问题讨论】:
-
不,您不应该修改元数据架构。查看我的回复。
标签: java oracle spring spring-batch