Я работаю над 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,