Hibernate Contextual会话

时间:2018-04-07 11:43:32

标签: java hibernate

ManagedSessionContextThreadLocalSessionContext之间的差异在维护会话的实现中都有ThreadLocal

1 个答案:

答案 0 :(得分:3)

ThreadLocalSessionContext - 它负责hibernate会话管理活动,如:

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

ManagedSessionContext - 上述会话管理活动的责任由一些外部实体(通常是某种形式的拦截器等)处理。

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

但是通过外部实体定义了对会话的绑定/取消绑定的调用,特别是何时调用会话的flush和close。

这提供了更大的灵活性,例如,在ThreadLocalSessionContext的情况下,会话在事务结束时自动关闭,并且无法使会话保持打开状态以满足多请求会话类型的要求。 / p>

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

引自Managing the current Session section

  • 当对话开始时,必须打开一个新的Session并与ManagedSessionContext.bind()绑定,以便为对话中的第一个请求提供服务。您还必须在该新会话上设置FlushMode.MANUAL,因为您不希望在您的背后发生任何持久性上下文同步。

  • 现在调用sessionFactory.getCurrentSession()的所有数据访问代码都会收到您绑定的Session。

  • 当对话中的请求完成时,您需要调用Managed-SessionContext.unbind()并将现在断开连接的Session存储到某个位置,直到对话中的下一个请求完成为止。或者,如果这是对话中的最后一个请求,则需要刷新并关闭会话。

以图形方式表示,

  • 使用ThreadLocalSessionContext进行会话范围设定

Session per Request

  • 使用ManagedSessionContext
  • Session-per-conversation实施了会话范围

Session per conversation interceptor

您可以浏览此链接的Listing 11.5以获取管理session-per-conversation模型会话的拦截器示例实现。