spring实现将hibernate的session绑定到请求的方法

3 篇文章 0 订阅
3 篇文章 0 订阅

<!-- /* Font Definitions */ @font-face {font-family:宋体; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-alt:SimSun; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} @font-face {font-family:"/@宋体"; panose-1:2 1 6 0 3 1 1 1 1 1; mso-font-charset:134; mso-generic-font-family:auto; mso-font-pitch:variable; mso-font-signature:3 135135232 16 0 262145 0;} /* Style Definitions */ p.MsoNormal, li.MsoNormal, div.MsoNormal {mso-style-parent:""; margin:0cm; margin-bottom:.0001pt; text-align:justify; text-justify:inter-ideograph; mso-pagination:none; font-size:10.5pt; mso-bidi-font-size:12.0pt; font-family:"Times New Roman"; mso-fareast-font-family:宋体; mso-font-kerning:1.0pt;} /* Page Definitions */ @page {mso-page-border-surround-header:no; mso-page-border-surround-footer:no;} @page Section1 {size:595.3pt 841.9pt; margin:72.0pt 90.0pt 72.0pt 90.0pt; mso-header-margin:42.55pt; mso-footer-margin:49.6pt; mso-paper-source:0; layout-grid:15.6pt;} div.Section1 {page:Section1;} -->

 

项目中用到了 OpenSessionInViewFilter 来将 hibernate session 对象绑定到每个请求线程中,如此,只要在一个请求过程中与 session 发生过关联的对象(也就是持久态对象)不管事务提交没提交,直到请求结束该对象都会一直保持持久态。

 

知其然更要知其所有然,那么 spring 是如何实现这个绑定,又是如何用它来进行事务管理的呢?

 

通过查看 spring 源代码可以发现:在 OpenSessionInViewFilter 中有个 doFilterInternal 方法,在这个方法里面有段这样的代码:

Session session = getSession(sessionFactory);                TransactionSynchronizationManager.bindResource(sessionFactory, new SessionHolder(session));

看到这里不难发现,每个请求被这个 filter 拦截的时候都会有一个 session TransactionSynchronizationManager.bindResource ()方法保存了起来,那么这个 session 被保存到了那里呢?通过查看 bindResource ()这个方法可以发现该 session 对象其实是被 sessionHolder(session) 包装后以 sessionFactory key sessionholder value 保存到了一个 map 对象中, map 对象又被保存到了 TransactionSynchronizationManager 类的一个 ThreadLocal 类型的属性中,借由将 session 保存到 threadlocal 中实现了将 session 绑定到请求的功能。

 

spring HibernateTransactionManager 中通过调用

SessionHolder sessionHolder = (SessionHolder)TransactionSynchronizationManager.getResource(getSessionFactory()); 方法来获取请求开始的时候保存到请求线程的 session ,从而实现了 session 的生命周期在整个请求过程中都有效的功能

 

真不敢想象要是Java没了threadLoacl spring该怎么办。。。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值