Java Spring Batch StoredProcedureItemReader 实现(SYSBASE IQ)
Posted
技术标签:
【中文标题】Java Spring Batch StoredProcedureItemReader 实现(SYSBASE IQ)【英文标题】:Java Spring Batch StoredProcedureItemReader Implementation (SYSBASE IQ) 【发布时间】:2018-10-15 11:55:58 【问题描述】:我正在实施春季批处理StoredProcedureItemReader
结果集类型。当我通过JdbcTemplate
调用过程时它工作正常,但是当我使用StoredProcedureItemReader
作为阅读器时它给了我一个错误。我使用 SYBASE IQ 作为 DB,存储过程返回类型是结果集。
代码片段:我对StoredProcedureItemReader
Spring Batch etl 的配置。方法有一个作业参数,我将其作为参数传递给过程(SYBASE IQ DB)。存储过程的返回类型是resultset一个多行select语句。
@Bean(destroyMethod="")
@StepScope
public StoredProcedureItemReader<TransactionReportingBean> dataExtractReader(
@Value("#jobParameters[clientName]") String clientName) throws Exception
StoredProcedureItemReader<TransactionReportingBean>
storedProcedureItemReader = new StoredProcedureItemReader<>();
storedProcedureItemReader.setDataSource(sybaseIqSource);
storedProcedureItemReader.setProcedureName("getResult"); /**getClientPositionIBORData**/
SqlParameter[] parameters = new SqlParameter("ClientName", Types.VARCHAR);
storedProcedureItemReader.setParameters(parameters);
storedProcedureItemReader.setPreparedStatementSetter(new PreparedStatementSetter()
@Override
public void setValues(PreparedStatement arg0) throws SQLException
arg0.setString(1,clientName);
);
storedProcedureItemReader.setRowMapper(new BeanPropertyRowMapper<TransactionReportingBean>(TransactionReportingBean.class));
storedProcedureItemReader.afterPropertiesSet();
storedProcedureItemReader.setVerifyCursorPosition(false);
storedProcedureItemReader.close();
return storedProcedureItemReader;
错误:
原因: org.springframework.dao.TransientDataAccessResourceException: 执行存储过程; SQL [call getResult(?)JZ0SB: 参数 索引超出范围:0.;嵌套异常是 java.sql.SQLException: JZ0SB:参数索引超出范围:0。 在 org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:228) 在 org.springframework.batch.item.database.AbstractCursorItemReader.doOpen(AbstractCursorItemReader.java:426) 在 org.springframework.batch.item.support.AbstractItemCountingItemStreamItemReader.open(AbstractItemCountingItemStreamItemReader.java:146) ... 33 更多 原因:java.sql.SQLException:JZ0SB:参数索引超出范围:0。 在 com.sybase.jdbc4.jdbc.ErrorMessage.raiseError(未知来源) 在 com.sybase.jdbc4.jdbc.ParamManager.int(未知来源) 在 com.sybase.jdbc4.jdbc.ParamManager.doGetOutValueAt(未知来源) 在 com.sybase.jdbc4.jdbc.ParamManager.doGetOutObjectAt(未知来源) 在 com.sybase.jdbc4.jdbc.ParamManager.getOutObjectAt(未知来源) 在 com.sybase.jdbc4.jdbc.SybCallableStatement.getObject(未知来源) 在 org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement.getObject(DelegatingCallableStatement.java:144) 在 org.apache.tomcat.dbcp.dbcp.DelegatingCallableStatement.getObject(DelegatingCallableStatement.java:144) 在 org.springframework.batch.item.database.StoredProcedureItemReader.openCursor(StoredProcedureItemReader.java:221) ... 35 更多 2018-10-15 16:57:25 - main - 错误 [AbstractStep:274]:在作业步骤中关闭步骤执行资源时出现异常 dataExtractorStepJob org.springframework.batch.item.ItemStreamException:关闭项目阅读器时出错
【问题讨论】:
能否分享一下与jdbcTemplate正常工作的代码进行比较? 你为什么打电话给close
和afterPropertiesSet
?不要那样做。
删除后还是不行
【参考方案1】:
首先需要删除storedProcedureItemReader.close()
,Spring Batch会在结果集结束时自动关闭阅读器。
根据堆栈跟踪,您可能需要将 refCursorPosition
设置为 1:
storedProcedureItemReader.setRefCursorPosition(1);
希望这会有所帮助。
【讨论】:
以上是关于Java Spring Batch StoredProcedureItemReader 实现(SYSBASE IQ)的主要内容,如果未能解决你的问题,请参考以下文章
Java spring boot + spring batch:处理大量信息
spring batch(二):核心部分:配置Spring batch
Java Spring Batch:如何验证执行是并行完成的?
Java Spring Batch StoredProcedureItemReader 实现(SYSBASE IQ)