Spring JPA hibernate - повторные транзакции в API, что замедляет работу

Я работаю над API весной - приложение JPA - Hibernate. API получает список ордеров, которые необходимо сохранять один за другим.

Метод контроллера подобен ниже

bulkUpsert(@RequestBody Orders orders){
  for(Order order:orders.getOrders()){
       saveOrUpdateOrder(order);
  }
}

Сервисный метод ниже

@Transactional
saveOrUpdateOrder(Order order){
   //do processing and call dao methods to save/update
}

вот моя конфигурация пружины

<bean id="transactionManager"
      class="org.springframework.orm.jpa.JpaTransactionManager"
      p:entityManagerFactory-ref="entityManagerFactory">
    <property name="defaultTimeout" value="${jdbc.defaultTransactionTimeout}"/>
</bean>
<tx:annotation-driven transaction-manager="transactionManager"/>

web xml:

 <filter>
    <filter-name>OpenEntityManagerInViewFilter</filter-name>
    <filter-class>org.springframework.orm.jpa.support.OpenEntityManagerInViewFilter</filter-class>
  </filter>

Теперь проблема, которую я наблюдаю, заключается в том, что по мере того, как количество заказов не увеличивается, время завершения API экспоненциально возрастает. Я не ожидал этого, поскольку я выполняю заказы один за другим. ЕСЛИ первые 100 заказов занимают около 10 секунд, тогда 900-й-1000-й заказы занимают более 1 минуты.

Теперь, если я добавлю OpenEntityManagerInViewInterceptor.clear () сразу после вызова saveOrUpdateOrder в цикле метода контроллера (bulkUpsert), api станет быстрым.

Хотя я счастлив, что проблема решена, но я сбив с толку, поскольку мое понимание не совпадает с тем, что произошло. Я ожидал, что когда транзакция завершится, все будет скрыто, и все снова начнется снова для следующей транзакции.

Разве это не так?

Ли сущности остаются в сеансе, даже когда транзакция совершается?

spring,hibernate,jpa,entitymanager,

0

Ответов: 1


1 принят

В теории вы правы, однако, поскольку Spring Boot по умолчанию включает в себя, EntityManagerкоторый позволяет открытому EntityManager в виде шаблона . Это, в свою очередь, приводит вас к одному EntityManagerзапросу.

Это объясняет поведение, которое вы видите, когда ожидаете получить новую и свежую EntityManagerтранзакцию, но вместо этого EntityManagerповторная регистрация будет повторно использована.

Вы можете решить эту проблему, отключив OpenEntityManagerInViewInterceptor. Сделайте это, установив spring.jpa.open-in-viewв falseв application.propertiesфайле. Это может, однако, привести к проблемам с другим кодом, который, возможно, неосознанно, зависит от открытого сущ.

весна, спящий режим, JPA, EntityManager,
Похожие вопросы
Яндекс.Метрика