Пакет JPA Spring boot вставляет обработку исключений

#java #spring-boot #hibernate #jpa #spring-data-jpa

#ява #пружинный ботинок #впадать в спящий режим #jpa #spring-data-jpa #java #spring-boot #переход в спящий режим

Вопрос:

Я работаю над вариантом использования в реальном времени, который должен загружать пакет сообщений в таблицу SQL Server с помощью spring boot JPA, добавляя все объекты модели в список и делая это для пакетных загрузок repository.saveAll(list) . Из-за производительности я не могу выполнять запись путем вставки записей. Я ищу приведенный ниже вариант.

Могу ли я каким-либо образом прочитать сообщение об ошибке и продолжить вставку других записей в таблицу. Я должен где-то сохранить это сообщение об ошибке и не должен передавать его нижестоящим приложениям.

Ответ №1:

saveAll Метод Spring data JPA фактически сохраняет список записей одну за другой:

 /*
 * (non-Javadoc)
 * @see org.springframework.data.jpa.repository.JpaRepository#save(java.lang.Iterable)
 */
@Transactional
@Override
public <S extends T> List<S> saveAll(Iterable<S> entities) {

    Assert.notNull(entities, "Entities must not be null!");

    List<S> result = new ArrayList<S>();

    for (S entity : entities) {
        result.add(save(entity));
    }

    return resu<
}
  

Тем не менее, разница между обработкой цикла сообщений самостоятельно или предоставлением его Spring data JPA для выполнения задания: saveAll использует свойство spring.jpa.properties.hibernate.jdbc.batch_size=4 , чтобы определить, активирована пакетная обработка или нет, и в зависимости от размера пакета вставка может выполняться лучше.

Я думаю, вам просто нужно самостоятельно обрабатывать сообщения и самостоятельно исправлять ошибки:

 for(EnitityType entity: list){
  try{
    repository.save(entity);
  } catch (Exception e){
    // Do what you want
  }
}
  

Комментарии:

1. insertAll использует свойство spring.jpa.properties.hibernate.jdbc.batch_size=4 , чтобы определить, активирована пакетная обработка или нет, и в зависимости от размера пакета вставка может выполняться лучше. Я думаю, что с точки зрения производительности это не то же самое, что создание пользовательского цикла