必威体育Betway必威体育官网
当前位置:首页 > IT技术

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

时间:2019-08-23 22:42:13来源:IT技术作者:seo实验室小编阅读:64次「手机版」
 

sessionfactory

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

 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),它表示与数据库进行交互的一个工作单元。

相关阅读

有关什么情况下session会失效

以前发了一个帖子,觉得好奇很多人竟然认为关闭浏览器session就失效了  或者认为session失效和关闭浏览器有关系很多评论  让我

如何在JSP中清空Session中的值?

session.invalidate(); 是把session内的所有属性 都清除,session.removeAttribute("uiUsers");是清除session中的 "uiUsers" 属性,就

tf.train.MonitoredSession 简介

在run过程中的集成一些操作,比如输出log,保存,summary 等 基类一般用在infer阶段,训练阶段使用它的子类 tf.train.MonitoredTrainin

session个某个属性多次赋值

request.getSession().setAttribute("startPage", "1");request.getSession().setAttribute("startPage", "2");request.getSessi

php7 Session_start()函数的变化-------每天进步一点

php7以前,我们使用session前都是要先代用session_strat()函数来初始化的,但这个函数是没有参数可以传的,session的配置都在php.ini文

分享到:

栏目导航

推荐阅读

热门阅读