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