初学者易上手的SSH-hibernate03 三大状态与缓存

这章主要来浅的学习下hibernate三大状态与缓存。首先来看下三大状态:

如上图,三大状态分别为临时状态(Transient),持久化状态(Persistent),游离状态(Detached)。那么三大状态具体怎么来解释?

Student stu = new Student("学生1","","长沙",20);

如上代码段,new一个学生对象,内存中有了该对象,但数据库与session缓存中并不存在,即此时为临时状态

        Student stu = new Student("学生1", "", "长沙", 20);
        
        session.saveOrUpdate(stu);

transaction.commit();

 new出来的对象加入到session缓存中,并同过底层的sql语句操作对象到数据库中,即此时为持久化状态。

        session.close();
    
        sessionfactory.close();

 关闭session对象后,学生对象依然存在数据库中,但却已不存在于session中,即脱离了session对象,此时为游离状态。

 

接下来看缓存:

缓存是介于物理数据源与应用程序之间,是对数据库中的数据复制一份临时放在内存中的容器,其作用是为了减少应用程序对物理数据源访问的次数,从而提高了应用程序的运行性能。Hibernate在进行读取数据的时候,根据缓存机制在相应的缓存中查询,如果在缓存中找到了需要的数据(我们把这称做“缓存命 中"),则就直接把命中的数据作为结果加以利用,避免了大量发送SQL语句到数据库查询的性能损耗。

hibernate缓存分为一级缓存与二级缓存,一级缓存就是我们常用的session,而二级缓存就是SessionFactory。

Session内置不能被卸载,Session的缓存是事务范围的缓存(Session对象的生命周期通常对应一个数据库事务或者一个应用事务)。
一级缓存中,持久化类的每个实例都具有唯一的OID。

由于SessionFactory对象的生命周期和应用程序的整个过程对应,因此Hibernate二级缓存是进程范围或者集群范围的缓存,有可能出现并发问题,因此需要采用适当的并发访问策略,该策略为被缓存的数据提供了事务隔离级别。
第二级缓存是可选的,是一个可配置的插件,默认下SessionFactory不会启用这个插件。
Hibernate提供了org.hibernate.cache.CacheProvider接口,它充当缓存插件与Hibernate之间的适配器。

在通常情况下会将具有以下特征的数据放入到二级缓存中:

●   很少被修改的数据。

●   不是很重要的数据,允许出现偶尔并发的数据。

●   不会被并发访问的数据。

●   参考数据。

       而对于具有以下特征的数据则不适合放在二级缓存中:

●   经常被修改的数据。

●   财务数据,绝对不允许出现并发。

●   与其他应用共享的数据。

那么来配置一个二级缓存吧。

首先要导入ehcache包以及hibernate-ehcache包(对应hibernate版本),既然是maven项目,那么当然在pom.xml中引入依赖。

<!--hibernate-ehcache -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-ehcache</artifactId>
            <version>5.2.10.Final</version>
        </dependency>

        <!--net.sf.ehcache/ehcache -->
        <dependency>
            <groupId>net.sf.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>2.10.4</version>
        </dependency>

接下来在hibernate.cfg.xml中进行配置

        <!-- 开启二级缓存 -->
        <property name="cache.use_second_level_cache">true</property>
        <!-- 开启查询二级缓存 -->
        <property name="cache.use_query_cache"></property>
        <!-- Hibernate4.0以上设置factory 缓存工具 -->
        <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
        <!-- 二级缓存 ehcache的配置文件位置 -->
        <property name="hibernate.cache.provider_configuration_file_resource_path">ehcache.xml</property>
        <!-- 映射文件 -->
        <mapping resource="com/entity/Student.hbm.xml" />
        <!-- 需要缓存的类 -->
        <class-cache usage="read-only" class="com.entity.Student" />

其中的ehcache.xml文件放与hibernate.cfg.xml同级即可。ehcache.xml里面的元素可以直接在以下路径中找到,不需要自己写。项目->Java Resources->Libraries->Maven Dependencies->ehcache-2.10.4.jar->ehcache-failsafe.xml

找到后打开,全选copy复制,再把<diskStore path="java.io.tmpdir"/>节点中path路径改成你自己定义的即可。最后测试二级缓存。

@Test
    public void test() {
        // 获取配置信息
        Configuration configuration = new Configuration().configure();
        // 得到Session工厂
        SessionFactory factory = configuration.buildSessionFactory();
        // 得到Session
        Session session = factory.openSession();
        Session session1 = factory.openSession();
        // 开启事物
        Transaction transaction = session.beginTransaction();
        // 根据主键得到对象(查询单个记录)
        Student st = session.get(Student.class, 1);
        System.out.println(st);
        // 二级缓存
        List<Student> ls = session1.createQuery("from Student").setCacheable(true).list();
        for (Student s : ls) {
            System.out.println(s);
        }
        // 提交事物
        // transaction.commit();
        // 关闭seeion
        session.close();
        // 关闭SessionFactory
        factory.close();
    }

 

自己对缓存也不是很懂!
本章结束。

 

posted @ 2017-10-27 15:37  柯一  阅读(592)  评论(1编辑  收藏  举报