【问题标题】:Java Spring Batch StoredProcedureItemReader Implementation (SYSBASE IQ)Java Spring Batch StoredProcedureItemReader 实现(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?不要那样做。
  • 删除后还是不行

标签: java spring spring-batch


【解决方案1】:

首先需要删除storedProcedureItemReader.close(),Spring Batch会在结果集结束时自动关闭阅读器。

根据堆栈跟踪,您可能需要将 refCursorPosition 设置为 1:

storedProcedureItemReader.setRefCursorPosition(1);

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 2013-12-18
    • 2016-01-02
    • 2018-09-19
    • 1970-01-01
    • 2016-07-13
    • 1970-01-01
    • 1970-01-01
    • 2019-08-26
    • 2012-09-19
    相关资源
    最近更新 更多