我正在使用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>
所以我将 SQL 语句添加到 JobParametersBuilder...
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 表中参数列的默认值?