ManagedSessionContextThreadLocalSessionContext两者在实现中都具有ThreadLocal来维护会话有什么区别

最佳答案

ThreadLocalSessionContext-它负责休眠会话管理活动,例如:


如果尚不存在,则创建一个会话。
将会话绑定到ThreadLocal,以便sessionFactory.getCurrentSession()返回此绑定的会话,并在事务完成后将其解除绑定。
在事务结束时刷新并关闭会话。


ManagedSessionContext-像上面这样的会话管理活动的责任由某个外部实体(通常是某种形式的拦截器等)来处理。

在这两种情况下,会话均存储在ThreadLocal中。

但是,通过外部实体定义了绑定/取消绑定会话的调用,尤其是何时调用会话的刷新和关闭。

这提供了更大的灵活性,例如,在ThreadLocalSessionContext的情况下,会话在事务结束时自动关闭,并且对于多请求会话类型的需求,无法将会话保持打开状态。

ManagedSessionContext的情况下,我们可以实现多请求对话(a.k.a session-per-conversation model),同一会话需要保持打开状态,并应在整个用户请求中重用。因此,在第一个用户请求中,我们插入/更新/删除一些实体,在下一个请求中,我们进行更多操作,最后在第三次交互结束时,我们要提交数据。

Managing the current Session section引用


对话开始时,必须打开一个新的Session并将其与ManagedSessionContext.bind()绑定,以处理对话中的第一个请求。您还必须在该新会话上设置FlushMode.MANUAL,因为您不希望任何持久化上下文同步发生在后台。
现在调用sessionFactory.getCurrentSession()的所有数据访问代码都将接收您绑定的会话。
对话中的请求完成后,您需要调用Managed-SessionContext.unbind()并将当前断开连接的Session存储在某个位置,直到在对话中发出下一个请求为止。或者,如果这是会话中的最后一个请求,则需要刷新并关闭会话。


为了形象地表示,


使用ThreadLocalSessionContext进行会话作用域


java -  hibernate 上下文 session-LMLPHP






使用ManagedSessionContext为Session-per-conversation实现的会话范围


java -  hibernate 上下文 session-LMLPHP

您可以通过此链接的Listing 11.5获得用于实现示例示例的拦截器,该拦截器管理session-per-conversation模型的会话。

07-24 17:50