При использовании данных пружины мы автоматически подключаем EntityManager
и меняем его режим промывки на COMMIT (вместо использования по умолчанию AUTO) в наших @Scheduled
и @Transactional
методах. Есть ли у нас гарантия, что изменение EntityManager
сбрасывающего режима в этом методе (или в общих свойствах EntityManager) не будет протекать вне метода @Scheduled
(я имею в виду автоматическое подключение его в другом классе где-то за пределами @Scheduled
)? Что если тот же поток, используемый @Scheduled
, будет повторно использован в другом месте? Является ли EntityManager
ограниченным потоком или чем-то еще, или это все время другой экземпляр?
Мы попытались немного проанализировать его и распечатали текущий поток, менеджер сущностей и значения режима сброса внаш планировщик вот так:
@Scheduled(cron = OUR_CRON)
@Transactional
public void run() {
log.info(entityManager);
log.info(entityManager.getFlushMode().name());
entityManager.setFlushMode(FlushModeType.COMMIT);
}
и результаты были такими:
2019-10-15 10:27:00.117 INFO 16461 --- [pool-5-thread-1] : Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@ba1a239]
2019-10-15 10:27:00.117 INFO 16461 --- [pool-5-thread-1] : AUTO
// --- next call of scheduler
2019-10-15 10:28:00.105 INFO 16461 --- [pool-5-thread-1] : Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@ba1a239]
2019-10-15 10:28:00.105 INFO 16461 --- [pool-5-thread-1] : AUTO
// --- next call of scheduler
2019-10-15 10:28:00.105 INFO 16461 --- [pool-5-thread-4] : Shared EntityManager proxy for target factory [org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean@ba1a239]
2019-10-15 10:28:00.105 INFO 16461 --- [pool-5-thread-4] : AUTO
Достаточно ли этого доказательства или что-то, о чем мы не знаем?