ManagedSessionContext
和ThreadLocalSessionContext
两者在实现中都具有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进行会话作用域
使用ManagedSessionContext为Session-per-conversation
实现的会话范围
您可以通过此链接的Listing 11.5获得用于实现示例示例的拦截器,该拦截器管理session-per-conversation
模型的会话。