我应该多久创建一个EntityManager?

AlB*_*lue 27 java jpa entitymanager

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

我可以做以下其中一项:

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

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

Qwe*_*rky 27

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

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

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

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