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.invalidate(); 是把session内的所有属性 都清除,session.removeAttribute("uiUsers");是清除session中的 "uiUsers" 属性,就
在run过程中的集成一些操作,比如输出log,保存,summary 等 基类一般用在infer阶段,训练阶段使用它的子类 tf.train.MonitoredTrainin
request.getSession().setAttribute("startPage", "1");request.getSession().setAttribute("startPage", "2");request.getSessi
php7 Session_start()函数的变化-------每天进步一点
php7以前,我们使用session前都是要先代用session_strat()函数来初始化的,但这个函数是没有参数可以传的,session的配置都在php.ini文