【问题标题】:Writing List of Items using JdbcBatchItemWriter使用 JdbcBatchItemWriter 编写项目列表
【发布时间】:2018-09-05 14:57:04
【问题描述】:

目前我正在使用 JpaItemWriter 编写对象列表,如下所示,工作正常。 由于性能问题,现在我想将 JpaItemWriter 更改为 JdbcBatchItemWriter。

    public class MyItemWriter implements ItemWriter<List<MyDomainObject>> {

    @Override  
    public void write(List<? extends Lists<MyDomainObject>> items) {
    JpaItemWriter<MyDomainObject> writer = new JpaItemWriter<>();    
    for(List<MyDomainObject> o : items)
        {
          writer.write(o);
        }
      }
    }

建议使用 JdbcBatchItemWriter 编写对象列表的示例 sn-ps 将有所帮助。尝试使用 ItemSqlParameterSourceProvider 它并没有帮助以 org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 异常结束

【问题讨论】:

    标签: list spring-batch spring-jdbc compositeitemwriter


    【解决方案1】:

    你的例子不正确。您正在write 方法中创建JpaItemWriter,因此每次调用write 时都会创建一个新实例。这可能是您的性能问题的原因。

    更重要的是,委托编写器的生命周期方法(打开/更新/关闭)将不会被兑现(JpaItemWriter 不是这种情况,它没有实现 ItemStream,但如果委托是,这将是一个问题一个项目流)。你的MyItemWriter 实现应该是这样的:

    public class MyItemWriter implements ItemWriter<List<MyDomainObject>> {
    
       private JpaItemWriter jpaItemWriter;
    
       public MyItemWriter(JpaItemWriter jpaItemWriter) {
          this. jpaItemWriter = jpaItemWriter;
       }
    
       @Override  
       public void write(List<? extends Lists<MyDomainObject>> items) {  
         for(List<MyDomainObject> o : items) {
           this. jpaItemWriter.write(o);
         }
       }
    }
    

    现在如果您想使用JdbcBatchItemWriter 编写列表列表,请参阅Spring Batch - Using an ItemWriter with List of Lists

    编辑:添加了如何在 cmets 中设置委托的示例代码:

    @Bean
    public ListUnpackingItemWriter<T> itemWriter() {
        JdbcBatchItemWriter<T> jdbcBatchItemWriter = null; // configure your jdbcBatchItemWriter
        ListUnpackingItemWriter<T> listUnpackingItemWriter = new ListUnpackingItemWriter<>();
        listUnpackingItemWriter.setDelegate(jdbcBatchItemWriter);
        return listUnpackingItemWriter;
    }
    

    【讨论】:

    • 您好,Hassine,感谢您提供详细信息。它确实有助于我详细理解代码。现在我正在尝试遵循stackoverflow.com/questions/37866312/… 中提供的解决方案,但最终出现java.lang.IllegalArgumentException: You must set a delegate! 错误。该帖子中也没有解决此异常的方法。你能帮忙吗?
    • 您需要调用setter setDelegate 并设置您要使用的委托项目编写器。
    • 我明白这一点,但我有点不清楚如何为我的特定作者设置委托。我们有任何示例 sn-p 可供查看吗?
    猜你喜欢
    • 2015-08-29
    • 2020-02-08
    • 1970-01-01
    • 1970-01-01
    • 2019-04-26
    • 1970-01-01
    • 1970-01-01
    • 2016-10-22
    • 1970-01-01
    相关资源
    最近更新 更多