Как часто следует создавать 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 на единицу работы.