Написание списка элементов с использованием JdbcBatchItemWriter - PullRequest
0 голосов
/ 05 сентября 2018

В настоящее время я использую 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 Ответ

0 голосов
/ 05 сентября 2018

Ваш пример не верен. Вы создаете JpaItemWriter в методе write, поэтому при каждом вызове write создается новый экземпляр. Это, вероятно, ваш источник производительности.

Что еще более важно, методы жизненного цикла модуля записи делегата (open / update / close) не будут учитываться (это не относится к 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;
}
...