在http请求开始时打开并关闭,每个http请求在一个单独的线程中处理?何时在Java EE环境中打开/关闭休眠会话
也许将所有会话保存在HashMap中并静态访问它?
任何解释hibernate会话如何工作的信息(或他们真正的工作)都是有帮助的。
在http请求开始时打开并关闭,每个http请求在一个单独的线程中处理?何时在Java EE环境中打开/关闭休眠会话
也许将所有会话保存在HashMap中并静态访问它?
任何解释hibernate会话如何工作的信息(或他们真正的工作)都是有帮助的。
如果在请求/请求结束时意味着http请求,那么通常通过一个servlet过滤器来完成,该servlet过滤器会为您打开/关闭会话。这种设计模式称为OpenSessionInView(Filter)。你可以得到详细信息here。
仅当应用程序呈现在存在Hibernate Session的相同JVM中时,此模式才有用。如果您的数据访问层位于与视图渲染层不同的JVM上,则您必须(急切地)获取所有必需的模型bean,然后分派呈现视图的请求。
如果您使用的是spring(或EJB3),您可以将Session(EntityManager)注入到您的数据访问类中,因此您无需手动处理打开和关闭会话。
理想情况下,您不应该需要手动打开/关闭会话/事务(因为它会遗漏session.close()或tx.commit()等)的机会。而是使用容器提供的JPA entitymanager或者使用spring来为你管理它。
有使用会话的多种模式,但最常见的,通常正确的一个是打开和关闭它在每个请求(=线程=工作单位)
在JavaEE的环境中,你通常会利用JPA。所以休眠通过EntityManager
,可以在部件被注射(如EJB或CDI管理豆)与@PersistenceContext
通常是会话中使用需要访问数据存储时是打开的(例如事务开始)。何时关闭它有不同的模式和方法。您可以保持会话在视图(jsps)中打开。但你不必这样做。
例如我们的一个项目不允许使用opensessionInView过滤器。所以会议在交易结束后关闭。所有数据(Value对象基本上)需要发送的视图都在调度之前加载。
同意。另外,如果你使用Spring MVC,它提供了一个'OpenSessionInViewFilter'和一个'OpenSessionInViewInterceptor'。 – SingleShot