我有一个EntityManagerFactory
,我可以为其创建一个(或多个)EntityManager
个实例。我正在使用Servlet环境,并且我有一个EntityManagerFactory连接到servlet(通过servlet上下文),它在servlet的生命周期内共享(因此,对于所有用户)。
我可以执行以下操作之一:
doGet
方法结束时关闭它)哪个最合适?创建EntityManager的成本是否显着? 如果我执行单个共享EntityManager,是否存在单个事务范围(即独立用户之间的更新可能会提交其他更改)?
答案 0 :(得分:25)
整个servlet的一个EM听起来不太好。如果您没有使用容器管理的EM(例如EJB3),那么重新建议是使用EM作为particular unit of work。
在Web应用程序上下文中,您的第三个建议(每个HTTP请求一个)听起来不错。但是,这可能会导致您陷入陷阱,因为您将服务层与数据库层绑在一起(您的服务层甚至不应该知道EM的存在)。
另一种方法是以编程方式对DAO中的事务进行demark,并让DAO为每个方法调用使用新的EM。
编辑:与创建重要开销的EMF相比,EM创建起来很便宜。使用一个EMF(看起来你可以)和许多EM是可行的。
答案 1 :(得分:1)
我们为每个slsb执行一个注入的实体管理器,并且slsb本身通过委托访问,其中每个会话有一个委托,它查找本地/远程接口。使用ejb3.0。
答案 2 :(得分:0)
是的,我同意NimChimpsky和Qwerky在访问数据库时使用EJB3.x并且每个工作单元使用一个EM。