Написание списка элементов с использованием 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;
}