Почему бы не использовать Spring OpenEntityManagerInViewFilter
Хотя на тему весны было написано много постовOpenSession / EntityManagerInViewFilter, я не могне найти ничего, что упоминает его недостатки. Из того, что я понимаю, и исходя из типичной многоуровневой архитектуры веб-приложений, использующей сервисный уровень @Transactional, фильтр работает следующим образом:
Фильтр перехватывает запрос сервлетаФильтр открывает EntityManager и привязывает его к текущему потоку.Веб-контроллер называетсяВеб-контроллер вызывает сервисПерехватчик транзакции начинает новую транзакцию, получает связанный с потоком EntityManager и связывает его с транзакциейСлужба вызывается, что-то делает с EntityManager, затем возвращаетПерехватчик транзакций сбрасывает EntityManager и фиксирует транзакцию.Веб-контроллер готовит представление, затем возвращаетВид построенФильтр закрывает EntityManager и отвязывает его от текущего потокаНа шагах 8 и 9 объекты, которые были загружены потоком 'EntityManager все еще управляется. Следовательно, если на этих этапах затрагиваются ленивые ассоциации, они будут загружены из базы данных с помощью все еще открытого EntityManager. Из того, что я понимаю, каждый такой доступ потребует, чтобы база данных открыла транзакцию. Весна'Управление транзакциями не будет знать об этом, поэтому я называю это "неявная транзакция ".
Я вижу 2 проблемы с этим:
Загрузка нескольких ленивых ассоциаций приведет к нескольким транзакциям базы данных, что может снизить производительностьКорневой объект и его ленивые ассоциации загружаются в разные транзакции базы данных, поэтому данные могут быть устаревшими (например, корень загружен потоком 1, корневые ассоциации обновлены потоком 2, корневые ассоциации загружены потоком 1)С одной стороны, этих двух проблем кажется достаточно, чтобы отказаться от использования этого фильтра (снижение производительности, несогласованность данных). С другой стороны, это решение очень удобно, позволяет избежать написания нескольких строк кода, проблема 1 может быть не такой заметной, а проблема 2 - чистой паранойей.
Как вы думаете?
Спасибо!