浅谈HIbernate缓存

浅谈HIbernate缓存

缓存的概念

  缓存:是计算机领域的概念,它介于应用程序和永久性数据存储源之间

  缓存:一般人的理解就是在内存中的一块空间,其实也可以将二级缓存配置到硬盘。用白话来说就是一个存储数据的容器。我们关注的是那些数据需要放入二级缓存

  缓存的作用:降低应用程序直接读取数据库的频率。从而提高程序运行性能。缓存中的数据就是数据存储源中的数据的Copy。缓存的介质通常是内存

  

 

Hibernate一级缓存

     Hibernate一级缓存特点

   

   a.使用一级缓存的目的是为了减少对数据库的访问次数,从而提升hibernate的执行效率;(当执行一次查询操作的时候,执行第二次查询操作,先检查缓存中是否有数据,

    如果有数据就不查询数据库,直接从缓存中获取数据);

        b.Hibernate中的一级缓存,也叫做session的缓存,它可以在session范围内减少数据库的访问次数,只在session范围内有效,session关闭,一级缓存失败;

  c.只在session范围有效,作用时间短,效果不是特别明显,在短时间内多次操作数据库,效果比较明显。

  d.当调用session的save/saveOrUpdate/get/load/list/iterator方法的时候,都会把对象放入session缓存中;

  e.一级缓存是默认启用的,你不能让他失效

  验证一级缓存的存在

    

 1   Transaction transaction = null;
 2     Session session = null;
 3 
 4 
 5     @Before
 6     public void before() {
 7 
 8         session = (Session) SessionFactoryUtil.getCurrentSession();
 9         //开启事务
10         transaction = session.beginTransaction();
11     }
12    
13 @Test
14     public void testCache1() {
15         Dept dept = (Dept) session.get(Dept.class, 1);
16         System.out.println("=============缓存分界线=============");
17         System.out.println("查询一样的数据");
18         Dept dept2 = (Dept) session.get(Dept.class, 1);
19         System.out.println("===================================");
20         System.out.println("查询不一样的数据");
21         Dept dept3 = (Dept) session.get(Dept.class, 2);
22     }
23 
24 
25  @After
26     public void close() {
27         //提交食物
28         transaction.commit();
29     }

  查询结果

  

        可以看见第二次执行一样的查询语句是并没有生产新的SQL语句。这是因为第一次执行时会先去一级缓存中找数据如果没有的话在和数据库交互。然后把在数据库查询的结果放入到

 一级缓存之中第二次在查询一样的数据时当走到一级缓存的时候直接使用不用在和数据交互。

     执行原理图

 

HIbernate二级缓存

  HIbernate二级缓存概念

       我们知道一级缓存,并且一级缓存的作用范围就在session中,每个session都有一个自己的一级缓存,而二级缓存也就是比一级缓存的作用范围更广,存储的内容更多,我们知道session是由sesssionFactory创建出来的,一个sessionFactory能够创建很多个session,每个session有自己的缓存,称为一级缓存,而sessionFactory也有自己的缓存,存放的内容供所有session共享,也就是二级缓存。

     图解

 

    Hibernate二级缓存配置

    Hibernate二级缓存不同于一级缓存需要我们手动配置

    1.pom文件引入需要的jar

    

<!--配置需要的ehcahe插件-->
<dependency>
    <groupId>net.sf.ehcache</groupId>
    <artifactId>ehcache</artifactId>
    <version>1.2.3</version>
</dependency>

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

            2.在cfg.xml文件配置相关节点

<!--开启hibernate需要的2级缓存-->
<property name="cache.use_second_level_cache">true</property>
<property name="cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

  3.引入需要的缓存配置文件(resources文件夹下)

<ehcache>
    <!-- 默认的临时文件-->
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true"
            memoryStoreEvictionPolicy="LRU"
            />
</ehcache>

1.在hibernarte.cfg.xml中加入两个<property>

   2.1  hibernate.cache.use_second_level_cache  true

    <property name="hibernate.cache.use_second_level_cache">true</property>

     2.配置二级缓存的供应商

     <property name="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</property>

 3.设置你要缓存的类以及他的策略

    <class-cache class="cn.happy.entity.Dept" usage="read-write"></class-cache>、

 4.在resource目录下添加一个文件 ehcache.xml文件

 验证HIbernate二级缓存的存在

@Test
    public void testCache2() {
        System.out.println("===========前==========");
        Dept dept = (Dept) session.get(Dept.class, 1);
        session.close();
        System.out.println("===========后=========");
        session = (Session) SessionFactoryUtil.getCurrentSession();
        //开启事务
        transaction = session.beginTransaction();
        dept = (Dept) session.get(Dept.class, 1);
        System.out.println(dept);

    }

执行结果

 

 HIbernate二级缓存执行原理

      首先,当我们使用Hibernate从数据库中查询出数据,获取检索的数据后,Hibernate将检索出来的对象的OID放入缓存中key 中,然后将具体的POJO放入value中,

 

等待下一次再次向数据查询数据时,Hibernate根据你提供的OID先检索一级缓存,若有且配置了二级缓存,则检索二级缓存,如果还没有则才向数据库发送SQL语句,然后将查询出来的对象放入缓存中。

 

 

 

posted @ 2018-11-01 16:04  小白装大神  阅读(226)  评论(0编辑  收藏  举报