我应该多久创建一个EntityManager?

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

我可以做以下其中一项:

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

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

整个servlet的一个EM听起来不太好。 如果您没有使用容器管理的EM(例如EJB3),那么重新建议是将EM用于特定的工作单元 。

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

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

编辑:EMs创建起来很便宜,而EMF则有很大的开销。 使用一个EMF(看起来你可以)和许多EM是可行的方法。

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

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