我应该多久创建一次实体管理器?

2022-09-01 12:10:18

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

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

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

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


答案 1

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

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

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

编辑:与具有显着开销的EMF相比,创建EM的成本很低。使用一个EMF(看起来你这样做)和大量的EM是要走的路。


答案 2

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


推荐