文档章节

关于ThreadLocalSession和Transaction之间的关系

猪刚烈
 猪刚烈
发布于 2014/10/12 11:41
字数 723
阅读 21
收藏 0

org.hibernate.context.ThreadLocalSessionContext is: A CurrentSessionContext impl which scopes the notion of current session by the current thread of execution. Unlike the JTA counterpart, threads do not give us a nice hook to perform any type of cleanup making it questionable for this impl to actually generate Session instances. In the interest of usability, it was decided to have this default impl actually generate a session upon first request and then clean it up after the org.hibernate.Transaction associated with that session is committed/rolled-back. In order for ensuring that happens, the sessions generated here are unusable until after Session.beginTransaction() has been called. If close() is called on a session managed by this class, it will be automatically unbound.

Additionally, the static bind and unbind methods are provided to allow application code to explicitly control opening and closing of these sessions. This, with some from of interception, is the preferred approach. It also allows easy framework integration and one possible approach for implementing long-sessions.

如果只从 ThreadLocalSessionContext的名称上看,它所做的就是把一个session绑定到当前线程上,让当前线程作为session的上下文。这样,在service里不同的dao通过sessionFactory.getCurrentSession()得到的将是当前线程上的同一个session,这是非常必要的做法,通过使用同一个session确保了持久化对象的一致性。但是从 ThreadLocalSessionContext的代码来看,它并只是做了这一件事,它还做了另外一件非常“醒目”的事情:即给session包裹了一层代理org.hibernate.context.ThreadLocalSessionContext$TransactionProtectionWrapper,这个代理将拦截session的操作,对session的使用做出了如下的限制:

1.在没有显式地开始一个事务之前,不能使用session的任何数据访问方法。

2.一旦事务提交,session将自动close。

这种做法的意图非常明显,它将transaction的周期与session的同期也绑定在了一起, 实现了所谓的“session-per-request”编程模型。session-per-request就是session-per-transaction,这种编程模型把用户的一次请求做为一次独立的事物来处理,使用一个对应的session.这样,request(也就是thread),transaction,session三者的生命周期就变成一致的了。对绝大多数的应用, session-per-request几乎总是合理和正确的。在没有第三方管理事务或session(如jta和spring)的情况下,使用hibernate内置的threadlocal上下文来管理session是一个默认的选择。需要特别说明的是:如果在这种方式下,提交了一个事务之后,再使用getCurrentSession()来获取session时,将会得到一个新的session,旧的session已经从threadlocal中移除。但如果是我们是在实际应用中遇到这种情况,我们需要审视自己的设计是否真得需要这样做,还是我们的transaction提交的太早了?

 

关于Spring对Session的管理需要另作分析,

一方面,需要了解SpringSessionContext

另一方面,很多处理会和 HibernateTemplat有关系。从Spring的用户手册上看以知道:

HibernateTemplate 会确保当前Hibernate的 Session 实例的正确打开和关闭,并直接参与到事务管理中去。

本文转载自:http://blog.csdn.net/bluishglc/article/details/6101680

共有 人打赏支持
猪刚烈
粉丝 22
博文 708
码字总数 110
作品 1
海淀
程序员
私信 提问
SQL——什么是事务?事务的特性有哪些?

概念 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如b...

小杨_Ivan
2017/02/08
0
0
Struts filter使用学习笔记

Struts filter使用学习笔记 filter: 过滤组件,就是在请求与服务器之间的一个过滤组件。 使用struts的filter组件,需要下面步奏: 1.在web.xml中配置filter的相关信息 2.写相应的filter。 下...

慕广陵
2012/08/18
0
1
hibernate框架的核心对象和相关知识点

Hibernate架构 下图提供了hibernate体系的高层视图: Hibernate全面解决方案: Hibernate核心API Configuration 负责管理数据库的配置信息。数据库的配置信息包含了Hibernate连接数据库的一些...

无信不立
2014/08/14
0
0
关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

1.XA XA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管...

如何让他和
2016/08/11
35
1
关于分布式事务、两阶段提交、一阶段提交、Best Efforts 1PC模式和事务补偿机制的研究[转]

1.XA XA是由X/Open组织提出的分布式事务的规范。XA规范主要定义了(全局)事务管理器(Transaction Manager)和(局部)资源管理器(Resource Manager)之间的接口。XA接口是双向的系统接口,在事务管...

看到了打开了
2016/10/30
28
1

没有更多内容

加载失败,请刷新页面

加载更多

对接比特币钱包的PHP开发包

BtcTool是一个基于第三方服务和离线裸交易实现的PHP比特币应用开发包,适合不希望部署本地 节点旳PHP开发者,开发包主要包含以下特性: 利用第三方服务获取指定地址的utxo集合 离线生成消费裸...

汇智网教程
16分钟前
1
0
【自用】 VHD to VHDX

VHDX: 在VHD 2TB 的基础上提供 64TB的容量。 支持逻辑扇区大小为 4KB,和每块的大小为 256MB,来优化虚拟磁盘性能。 比VHD提供更高的安全性、可靠性和性能。 convert-VHD –path d:\Hyper-v...

Tensor丨思悟
29分钟前
1
0
30 岁转行做Python开发晚吗?而且是零基础

最近有小伙伴问小编,30 岁转行做Python开发晚吗? 小编想说,其实无论男女,只要想学,有这个动力,就直接去行动。无论年龄,无论性别,只要你想一直勇往直前,那么想做的就去做吧~这里有一...

糖宝lsh
39分钟前
10
0
详解Spring中的Profile

前言 由于在项目中使用Maven打包部署的时候,经常由于配置参数过多(比如Nginx服务器的信息、ZooKeeper的信息、数据库连接、Redis服务器地址等),导致实际现网的配置参数与测试服务器参数混淆...

watermelon11
54分钟前
4
0
phper必知必会(二)

  1.说说你对进程,线程以及协程的理解      进程:是系统进行资源分配和调度的基本单位,是基本操作系统结构的基础。进程是程序基本执行的实体。进程与进程之间是独立的,拥有完全独立...

SEOwhywhy
今天
4
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部