2010-11-19 80 views
25

我有一个EntityManagerFactory我可以创建一个(或多个)EntityManager实例。我使用的是一个Servlet环境,并且我有一个EntityManagerFactory连接到servlet(通过servlet上下文),该servlet在servlet的生命周期中共享(因此也适用于所有用户)。应该多久创建一个EntityManager?

我可以做下列之一:

  • 我的servlet的生命周期(例如,所有用户之间共享)
  • 为每个用户创建一个(因此每个用户得到自己在创建一个单一的EntityManager在HttpSession)
  • 比方说,通过实例化一个新的并在一个doGet方法结束)

哪个是最合适的关闭它创建每HTTP请求(一个?创建EntityManager的成本是否显着? 如果我做一个共享的EntityManager,是否有单个事务范围(即独立用户之间的更新可以提交其他更改)?

回答

24

整个servlet的一个EM听起来不太好。如果您没有使用容器管理的EM(例如EJB3),则建议使用EM作为particular unit of work

在Web应用程序上下文中,您的第三个建议(每个HTTP请求一个)听起来不错。但是,这可能会导致您陷入一个陷阱,即将服务层与db层绑定在一起(您的服务层甚至不应该意识到EM的存在)。

另一种方法是在您的DAO中以编程方式对交易进行划分,并让您的DAO为每个方法调用使用新的EM。

编辑:EM创建起来很便宜,而EMF的开销却不大。使用一个EMF(看起来你是这样做的)和大量的EM是要走的路。

+0

同意。我完全建议你使用像EJB 3或Spring Framework这样的集成框架,它将消除EntityManager管理的负担。 – 2010-11-19 15:29:15

1

我们为每个slsb做一个注入实体管理器,并且slsb本身通过一个委托来访问,每个会话都有一个委托来查询本地/远程接口。使用ejb3.0。

+0

每个会话如何有一个无状态bean?无状态bean根据定义不被绑定到会话。 – 2010-11-19 15:26:57

+0

@ Philipp Jardas编辑。无状态bean被定义为不存储可序列化的会话状态/数据。因此,它非常有效地为每个会话创建一个slsb实例。我的理解是他们的开销比SFSB少得多。 – NimChimpsky 2010-11-19 16:13:45

+0

“有效为每个会话创建一个slsb实例”。从什么时候我们得到一个工厂方法,允许我们创建无状态的EJB实例?我认为你的意思是应用程序控制生命周期的有状态的EJB:(每次查找产生一个新的bean,应用程序必须调用@Remove方法或让bean超时)或者隐式地控制通过CDI的生命周期(例如使用@SessionScoped)。 – 2015-11-24 17:06:38

0

是的,我同意NimChimpsky和Qwerky在访问数据库时使用EJB3.x,并且每个工作单元使用一个EM。