代码之家  ›  专栏  ›  技术社区  ›  AlBlue RACGAMERUP

我应该多久创建一个EntityManager?

  •  26
  • AlBlue RACGAMERUP  · 技术社区  · 14 年前

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

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

    • 在我的servlet的生命周期内创建一个EntityManager(例如,在所有用户之间共享)
    • 为每个用户创建一个(这样每个用户在httpsession中都有自己的用户)
    • 为每个HTTP请求创建一个(例如,通过实例化一个新请求并在 doGet 方法)

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

    3 回复  |  直到 14 年前
        1
  •  25
  •   Qwerky    14 年前

    整个servlet一个em听起来不太好。如果不使用容器管理的em(例如ejb3),则建议使用em作为 particular unit of work .

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

    另一种方法是通过编程在DAO中重新标记事务,并让DAO为每个方法调用使用一个新的em。

    编辑:创建ems比创建emf便宜 重要的 开销。使用一个EMF(看起来是这样做的)和大量的EMS是一种方法。

        2
  •  1
  •   NimChimpsky    14 年前

    我们为每个人做一个注入的实体管理器 slsb ,SLSB本身通过一个委托进行访问,其中每个会话有一个委托,用于查找本地/远程接口。使用EJB3.0。

        3
  •  0
  •   Puce    14 年前

    是的,我同意Nimchimsky和Qwerky在访问DBS时使用EJB3.x,并在每个工作单元使用一个em。