我应该多久创建一个EntityManager?

时间:2010-11-19 13:56:16

标签: java jpa entitymanager

我有一个EntityManagerFactory,我可以为其创建一个(或多个)EntityManager个实例。我正在使用Servlet环境,并且我有一个EntityManagerFactory连接到servlet(通过servlet上下文),它在servlet的生命周期内共享(因此,对于所有用户)。

我可以执行以下操作之一:

  • 为我的servlet的生命周期创建一个EntityManager(例如,在所有用户之间共享)
  • 为每个用户创建一个(因此每个用户在HttpSession中获得自己的用户)
  • 为每个HTTP请求创建一个(例如,通过实例化一个新请求并在doGet方法结束时关闭它)

哪个最合适?创建EntityManager的成本是否显着? 如果我执行单个共享EntityManager,是否存在单个事务范围(即独立用户之间的更新可能会提交其他更改)?

3 个答案:

答案 0 :(得分:25)

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

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

另一种方法是以编程方式对DAO中的事务进行demark,并让DAO为每个方法调用使用新的EM。

编辑:与创建重要开销的EMF相比,EM创建起来很便宜。使用一个EMF(看起来你可以)和许多EM是可行的。

答案 1 :(得分:1)

我们为每个slsb执行一个注入的实体管理器,并且slsb本身通过委托访问,其中每个会话有一个委托,它查找本地/远程接口。使用ejb3.0。

答案 2 :(得分:0)

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