SessionFactory的作用:
SessionFactory是hibernate的核心接口,它实际起到一个缓冲区的作用,它缓冲了hibernate自动生成的SQL语句以 及相关的映射关系数据,还缓冲了一些有可能被重复利用的数据。
创建SessionFactory:
先来介绍一个Configuration类,该类的主要作用是解析hibernate的配置文件以及映射文件中的信息,即负责管理 hibernate的配置信息。hibernate在运行时需要获取一些底层实现需要的基本信息,如:数据库驱动类,URL,数据库登录密码等。这些信息都需要Configuration来加载。
hibernate3被遗弃的创建SessionFactory方式:
1>创建Configuration对象,并通过configure方法来加载并解析配置文件
Configuration conf = new Configuration() .configure();
configure()方法默认加载classpath下的hibernate.cfg.xml文件,当然也可以指定某一路径下的配置文件
2>创建SessionFactory
SessionFactory sf = conf . buildSessionFactory() ;
写到这儿就会发现一个问题,不是说SessionFactory是一个接口吗,怎么可以被实例化呢?这就涉及到java基础的 多态问题了。其实这里的 sf 只是一个引用,将子类对象的值传递给父类或接口的引用,也称之为上转型对象,通 过使用父类的引用调用子类的实现,以实现类的多态性。这里buildSessionFactory方法的返回值是SessionFactory 接口的实现类。所以可以将值传递给引用sf,而并非实例化接口。
然而这种创建SessionFactory的方式已经被hibernate4抛弃了,接下来看一下hibernate4中创建SessionFactory的方 法
hibernate4创建SessionFactory方式:
1>创建Configuration对象,并通过configure方法来加载并解析配置文件
Configuration conf = new Configuration() . configure();
2>构建一个ServiceRegistry对象
ServiceRegistry serviceRigistry = new ServiceRigistryBuilder()
.applySetting(conf.getProperties).buildServiceRigistry()
3>创建SessionFactory
SessionFactory sf = conf . buildSessionFactory(serviceRigistry) ;
我们发现升级版的SessionFactory创建方式只是多了一个创建 ServiceRegistry接口,那是用这个接口的作用是什 么?Hibernate4规定所有应用于其中的配置或者服务都要统一向这个接口注册之后才能生效,所以需要构建一 个ServiceRegistry对象,将所有的配置信息向他注册,然后Configuration对象从中获取配置信息创建SessionFactory
关于为什么要这么做,官方给的解释是方便管理。
SessionFactory的线程安全问题:
SessionFactory是线程安全的,它可以有效的控制并发,不会出现数据丢失,返回不正确等现象。允许多个并发线 程可以同时在一个SessionFactory中获取session实例。SessionFactory是重量级对象,随意的创建会占用大量的 内存空间。通常的项目中只应用一个数据库,则只需要在单例模式下创建一个SessionFactory实例即可,当项目中 需要访问多个数据库时,我们才需要创建多个SessionFactory实例。