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正常工作的代码进行比较? 你为什么打电话给closeafterPropertiesSet?不要那样做。 删除后还是不行 【参考方案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)

Java Spring Boot 加 Spring Batch 创建 Jar 并仅运行特定作业

重试不使用带有 Java Config 的 Spring Batch