Написание списка элементов с использованием JdbcBatchItemWriter

В настоящее время я использую 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 для написания Списка объектов, поможет. Попытка с использованием ItemSqlParameterSourceProvider это не помогло в конечном итоге org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter исключение

1 ответ

Решение

Твой пример не верный. Вы создаете JpaItemWriter в write метод, поэтому новый экземпляр создается при каждом вызове 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 чтобы написать список списков, см. Использование ItemWriter со списком списков.

Изменить: Добавлен пример кода, как установить делегата в соответствии с просьбой в комментариях:

@Bean
public ListUnpackingItemWriter<T> itemWriter() {
    JdbcBatchItemWriter<T> jdbcBatchItemWriter = null; // configure your jdbcBatchItemWriter
    ListUnpackingItemWriter<T> listUnpackingItemWriter = new ListUnpackingItemWriter<>();
    listUnpackingItemWriter.setDelegate(jdbcBatchItemWriter);
    return listUnpackingItemWriter;
}
Другие вопросы по тегам