【问题标题】:Spring batch, unable to write on oracle databaseSpring批处理,无法在oracle数据库上写入
【发布时间】:2019-02-12 16:40:10
【问题描述】:

这是我的 xml 文件配置。

    <batch:job id="pdgRecallJob">
        <batch:step id="stepTmpRecall">
            <batch:tasklet>
                <batch:chunk reader="readFileRecall" processor="" writer="tmpRecallWriter" commit-interval="10000">
                </batch:chunk>
            </batch:tasklet>
        </batch:step>
    </batch:job>



    <bean id="tmpRecall" class="it.mef.pdg.batch.model.TmpRecall" scope="prototype" />


    <bean id="readFileRecall" class="org.springframework.batch.item.file.FlatFileItemReader">

        <property name="strict" value="false" />
        <property name="resource" value="classpath:/properties/RECALLPDG_*.txt"/>
        <property name="lineMapper">
        <bean class="org.springframework.batch.item.file.mapping.DefaultLineMapper">
          <property name="lineTokenizer">
            <bean class="org.springframework.batch.item.file.transform.DelimitedLineTokenizer">
                <property name="delimiter" value=";"/>
                <property name="names" value="appNomeFile, appCodFisc, appRata, appImporto, appIscrizione, appNumTitolo, 
                appProgQuota, appAnnoEmissione, appCodEnte, appEsitoMef, appStatoFile, appDpt, appPostazione, appNLotto, 
                appDLotto, appNomeFileOrigine" />
            </bean>
          </property>
          <property name="fieldSetMapper">   
              <bean class="org.springframework.batch.item.file.mapping.BeanWrapperFieldSetMapper">
                    <property name="prototypeBeanName" value="tmpRecall" />
              </bean>           
          </property>
        </bean>
        </property>

    </bean>


    <bean id="tmpRecallWriter" class="org.springframework.batch.item.database.JdbcBatchItemWriter">

        <property name="dataSource" ref="dataSource" />
        <property name="sql">
            <value>
            <![CDATA[
                INSERT INTO APP_TMP_RECALL(APP_NOME_FILE,APP_COD_FISC,APP_RATA,APP_IMPORTO,APP_ISCRIZIONE,APP_NUM_TITOLO,APP_PROGR_QUOTA,APP_ANNO_EMISSIONE,APP_COD_ENTE,APP_ESITO_MEF,APP_STATO_FILE,APP_DPT,APP_POSTAZIONE,APP_NLOTTO,APP_DLOTTO,APP_NOME_FILE_ORIGINE)
                VALUES (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?)
            ]]>
            </value>

        </property>

        <property name="itemPreparedStatementSetter">
            <bean class="it.mef.pdg.batch.items.TmpRecallPreparedStatementSetter" />
        </property>

    </bean>     

    <bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
        <property name="dataSource" ref="dataSource" />
    </bean>


    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource">
        <property name="driverClassName" value="oracle.jdbc.OracleDriver" />
        <property name="url" value="${db.url}" />
        <property name="username" value="${db.user}" />
        <property name="password" value="${db.pass}" />
    </bean>

然后我的 itemPreparedStatementSetter 类:

final class TmpRecallPreparedStatementSetter implements ItemPreparedStatementSetter<TmpRecall>{

public void setValues(TmpRecall tmp, PreparedStatement ps) throws SQLException {

    ps.setString(1, tmp.getAppNomeFile());
    ps.setString(2, tmp.getAppCodFisc());
    ps.setInt(3, tmp.getAppRata());
    ps.setDouble(4, tmp.getAppImporto());
    ps.setString(5, tmp.getAppIscrizione());
    ps.setInt(6, tmp.getAppNumTitolo());
    ps.setString(7, tmp.getAppProgQuota());
    ps.setInt(8, tmp.getAppAnnoEmissione());
    ps.setString(9, tmp.getAppCodEnte());
    ps.setString(10, tmp.getAppEsitoMef());
    ps.setString(11, tmp.getAppStatoFile());
    ps.setString(12, tmp.getAppDpt());
    ps.setInt(13, tmp.getAppPostazione());
    ps.setInt(14, tmp.getAppNLotto());
    ps.setDate(15, tmp.getAppDLotto());
    ps.setInt(16, tmp.getAppNLotto());


}

}

我的批次似乎可以工作,然后我的最终状态为 COMPLETED,但它没有在我的表中写入任何记录。

我正在使用 jdk 1.5,ojdbc5-11.2.0.3.jar。

我的 xml conf 中是否缺少某些内容或任何 bean 都不正常?

我在想这甚至可能是表中日期字段不匹配。

【问题讨论】:

  • 如果您没有处理器,则无需添加processor=""。您在日志中有任何错误吗?您确定您正在使用事务管理器并且事务已提交(如果您没有任何错误,这可能是缺少的内容)?

标签: database spring oracle spring-batch


【解决方案1】:

您目前没有项目处理器,(我认为)需要它来将记录从读取器传递给写入器。由于您没有进行任何处理(也就是说,您的阅读器生成的类型与您的作者使用的类型相同),我认为您可以在这里使用PassThroughItemProcessor

【讨论】:

  • 只是想提一下,项目处理器是可选的。不需要将记录从读取器传递到写入器。
  • 谢谢@MahmoudBenHassine - 我想可能是这样。
猜你喜欢
  • 2019-09-26
  • 1970-01-01
  • 2010-09-06
  • 2023-04-07
  • 2017-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-10
相关资源
最近更新 更多