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

来源:互联网 发布:mysql 5.9修改密码 编辑:程序博客网 时间:2024/05/24 05:09

<!-- /* 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来将hibernatesession对象绑定到每个请求线程中,如此,只要在一个请求过程中与session发生过关联的对象(也就是持久态对象)不管事务提交没提交,直到请求结束该对象都会一直保持持久态。

 

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

 

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

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

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

 

springHibernateTransactionManager中通过调用

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

 

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

原创粉丝点击