Как часто следует создавать EntityManager?

у меня есть EntityManagerFactory для которого я могу создать одну (или несколько) EntityManager экземпляров. Я использую среду сервлета, и у меня есть один EntityManagerFactory, подключенный к сервлету (через контекст сервлета), который является общим для всего срока службы сервлета (и, следовательно, для всех пользователей).

Я могу сделать одно из следующих действий:

  • создайте один EntityManager на время жизни моего сервлета (например, общий для всех пользователей)
  • создать по одному на пользователя (таким образом, каждый пользователь получает свой собственный в HttpSession)
  • создайте один на HTTP-запрос (скажем, создав экземпляр нового и закрыв его в конце doGet способ)

что наиболее подходит? Является ли стоимость создания EntityManager значительной? Если я делаю один общий EntityManager, есть ли одна область транзакции (т. е. обновления между независимыми пользователями могут фиксировать другие изменения)?

3 ответов


один EM для всего сервлета звучит не очень хорошо. Если вы не используете управляемые контейнером EM (например, EJB3), то рекомендуется использовать EM для определенная единица работы.

в контексте веб-приложения ваше третье предложение (по одному HTTP-запросу) звучит хорошо. Однако это может привести вас к ловушке, в которой вы связываете свой сервисный слой со своим слоем db (ваш сервисный слой даже не должен знать о существовании ЭМ.)

другим подходом было бы программно демаркировать транзакции в вашем DAO и заставить ваш DAO использовать новый EM для каждого вызова метода.

Edit: EMs дешевы для создания, в отличие от EMFs, которые имеют значительное накладные расходы. Использование одного EMF (что, похоже, вы делаете) и много EMs-это путь.


мы делаем один введенный entity manager для каждого slsb, - и slsb сам доступен через делегат, из которого есть один на сеанс, который ищет локальный/удаленный интерфейс. Используя ejb3.0.


Да, я согласен с Нимчимпским и Qwerky использовать EJB3.x при доступе к DBs и использовании одного EM на единицу работы.