我使用ItemReader/ItemWriter设置了一个Spring批处理作业,可将数据集从Oracle DB导出到CSV/Excel/PDF。对于阅读器部分,我使用的是JdbcCursorItemReader。Spring批处理作业参数限制为250个字符?
默认情况下它是必要的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
。
现在我知道,春天批次记录一切,它的日志表,有问题 - 参数字符串(含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语句进入STRING_VAL列被限制为250个字符。我检查了其他数据库系统(MySQL和DB2)的DDL,它似乎只限于250个字符。我现在将该栏目更改为CLOB
,工作正常,工作正常。
我的问题:我简直不能相信,它的目的是通过存储批处理作业限制在250个字符的工作参数。那么对于我的方案是否有更好的实现,还是打算更改BATCH_JOB_PARAMS表中参数列的默认值?
不,你不应该修改元数据模式。看到我的回应。 – Cygnusx1 2013-04-09 15:15:22