Как часто я должен создавать EntityManager?
У меня есть EntityManagerFactory
, для которого я могу создать один (или несколько) экземпляров EntityManager
. Я использую среду Servlet, и у меня есть один EntityManagerFactory, подключенный к сервлету (через контекст сервлета), который совместно используется для срока службы сервлета (и, следовательно, для всех пользователей).
Я могу сделать одно из следующего:
- Создайте единый EntityManager для срока службы моего сервлета (например, общий для всех пользователей)
- Создайте один для каждого пользователя (поэтому каждый пользователь получает свои собственные в HttpSession)
- Создайте один для HTTP-запроса (скажем, создавая новый экземпляр и закрывая его в конце метода
doGet
)
Что наиболее подходит? Значительна ли стоимость создания EntityManager?
Если я делаю один общий EntityManager, есть ли одна область транзакции (например, обновления между независимыми пользователями могут совершать другие изменения)?
Ответы
Ответ 1
Один EM для всего сервлета звучит не очень хорошо. Если вы не используете EMC, управляемую контейнером (например, EJB3), то рекомментация заключается в использовании EM для конкретной единицы работы.
В контексте веб-приложения ваше третье предложение (по одному на HTTP-запрос) звучит неплохо. Однако это может привести вас к ловушке, когда вы связываете свой сервисный уровень с вашим слоем db (ваш уровень обслуживания даже не должен знать о существовании EM).
Другим подходом было бы программно разделить транзакции в вашем DAO и заставить ваш DAO использовать новый EM для каждого вызова метода.
Изменить: EM дешево создавать в отличие от EMF, которые имеют значительные накладные расходы. Использование одной EMF (которая кажется, что вы это делаете), и множество EM - это путь.
Ответ 2
для каждого slsb выполняется один инъецируемый менеджер сущностей, и сам slsb получает доступ через делегат, из которых один за сеанс, который ищет локальный/удаленный интерфейс. Использование ejb3.0.
Ответ 3
Да, я согласен с NimChimpsky и Qwerky использовать EJB3.x при доступе к БД и использовать один EM на единицу работы.