博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
浅谈HIbernate缓存
阅读量:6604 次
发布时间:2019-06-24

本文共 3404 字,大约阅读时间需要 11 分钟。

浅谈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 @Test14     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  @After26     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

    

net.sf.ehcache
ehcache
1.2.3
org.hibernate
hibernate-ehcache
3.6.10.Final

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

true
org.hibernate.cache.EhCacheProvider

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

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语句,然后将查询出来的对象放入缓存中。

 

 

 

转载于:https://www.cnblogs.com/yzwss/p/9889800.html

你可能感兴趣的文章
input file样式,文件路径、文件名的获取
查看>>
while循环和 do while 的区别
查看>>
android 运行时出现The connection to adb is down, and a severe error has occured.(转)
查看>>
Oracle数据库修改表结构
查看>>
问题:关于贴友一个用js传递value默认值的简单实现
查看>>
Python dict dictionaries Python 数据结构——字典
查看>>
【SICP练习】151 练习4.7
查看>>
MySQL高可用架构之Keepalived+主从架构部署
查看>>
如何在分组时,连接多个行数据
查看>>
Codeforces 1149 B - Three Religions
查看>>
js中的scrollTop、offsetTop、clientTop
查看>>
11-border(边框)
查看>>
4.字符串(2-6/2-7)
查看>>
bugfree3.0.1-邮件配置
查看>>
ASP.Net MVC View(视图)
查看>>
有关git clone 下载速度变慢的解决方法
查看>>
Papervision3D Essentials中文版,附Papervision3D_2.1.920.swc和章节练习源码
查看>>
Mysql汉字乱码的解决
查看>>
FMDB增删改查小Demo
查看>>
UNIX网络编程卷2 源码编译篇
查看>>