通俗解释Hibernate中SessionFactory和Session是否是线程安全对象

 *******************************************************************

   SessionFactory接口负责Hibernate的初始化和建立Session对象。

   它在Hibernate中起到一个缓冲区作用. Hibernate可以将自动生成的SQL语句、映射数据以及某些可重复利用的的数据放在这个缓冲区中。同时它还保存了对数据库配置的所有映射关系,维护了当前的二级缓存。

   那我们也经常会看到这么一句话 : 

   SessionFactory是一个线程安全的对象,所有由该工厂生产的Session都共享工厂中维护的数据 .

* SessionFactory既然是一个单实例对象 , 如何实现线程安全 ? 

   首先我们来粗略的了解一下一般情况下的线程安全问题 , 如下图 :

   

   简单通俗的来说,一般情况下,多实例模式是线程安全的.而单实例模式中,如果共享变量是局部变量,也就是在方法中使用,即用即销,也是线程安全的;如果共享变量是成员变量,又分为两种情况:变量值始终不能发生变化 , 通常是线程安全的,变量值是发生变化的,一般是不安全的.

   以上可以作为线程安全的一个简单的判断 .

*************************************************************************************

   再来看SessionFactory . 

   SessionFactory在方法中创建Session,并返回给调用端,当然不存在线程问题,当然能保证为不同地点,不同线程的调用者提供不同的Session .


   而Session一旦创建,就要看调用者如何使用了,把它当做类变量使用,而又把这个类的实例供多个线程操作,而又不加排它锁,当然会出线程安全的问题。通常在控制单元(servletClass/struts的action)使用hibernateSession或jdbc的connection时,都不建议把它作为类变量来用 . 

所以说  

   SessionFactory对应Hibernate的一个数据存储的概念,它是线程安全的,可以被多个线程并发访问。SessionFactory一般只会在启动的时候构建。

   Session是一个轻量级非线程安全的对象(线程间不能共享session),它表示与数据库进行交互的一个工作单元。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值