hibernate session和thread绑定

本文详细解析了Hibernate框架中session的工作机制,包括如何通过hibernate.cfg.xml配置文件设置当前session的上下文为thread,以及getSession()方法与getCurrentSession()方法的区别。同时讨论了在事务提交时,getCurrentSession()返回的session会自动关闭,而getSession()返回的session则需要手动关闭。最后提供了关于如何合理使用session以避免资源浪费的建议。

1.在hibernate 中hibernate.cfg.xml 配置文件加:

<property name="current_session_context_class">thread</property>


官方对他的解释如下:
首先,只要你持有SessionFactory,大可在任何时候、任何地点调用这个方法:getCurrentSession()
方法总会返回“当前的”工作单元。记得我们在hibernate.cfg.xml中把这一配置选项调整为"thread"了吗?
因此,当前工作单元的范围就是当前执行我们应用程序的Java线程。但是,这并非总是正确的。
Session在第一次被使用的时候,或者第一次调用getCurrentSession()的时候,其生命周期就开始。
然后它被Hibernate绑定到当前线程。当事务结束的时候,不管是提交还是回滚,Hibernate也会把
Session从当前线程剥离,并且关闭它。假若你再次调用getCurrentSession(),你会得到一个新的Session,并且开始一个新的工作单元。

得到的Session总是当前线程的Session,这就是所谓的线程绑定。


2.getSession()方法和SessionFactory.getCurrentSession()有什么异同呢?

相同的地方是:第一次调用getSession()或SessionFactory.getCurrentSession()时,打开新Session,并把它与当前线程绑定。
不同的地方是:当事务被Commit时,SessionFactory.getCurrentSession()返回的Session会自动关闭,而
getSession()返回的Session仍然打开,需要显式关闭才行(也许是为了便于线程内重用吧)。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值