30

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

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

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

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

4

3 回答 3

29

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

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

另一种方法是以编程方式在 DAO 中标记事务,并让 DAO 为每个方法调用使用新的 EM。

编辑:与具有大量开销的 EMF 相比,EM 的创建成本低廉。使用一个 EMF(您似乎这样做)和许多 EM 是要走的路。

于 2010-11-19T14:30:02.820 回答
1

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

于 2010-11-19T14:00:50.983 回答
0

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

于 2010-11-19T15:16:18.293 回答