Hibernate的一级缓存

—hibernate中的一级缓存&快照

  • 简单验证一级缓存的存在
    User user1=  session.get(User.class,1);
    System.out.println(user1);
    User user2 = session.get(User.class,1);
    System.out.println(user2);
    System.out.println(user1 == user2);//判断两个对象是否一致

结果如下
这里写图片描述
这里程序中执行了两次get操作,但发现控制台只打印了一条sql查询语句,说明只对数据库进行一次查询操作,那么第二次的user2对象是怎么获取的呢?其实就是因为第一次执行get方法时缓存中还没有数据,所以向数据库发送一条sql查询语句,查找id为1的对象,然后存入了缓存,第二次执行的get方法其实就是直接从缓存中获取到了user2对象,并且可以发现user1user2两个对象是相等的
- 缓存原理
这里写图片描述

  • 快照
    执行如下代码:
User user = session.get(User.class,1);
    System.out.println("数据库中的原始数据为:"+user.getUserName());
    for(int i = 1;i<=5;i++){
        user.setUserName("第"+i+"次修改");
    }
    System.out.println("数据库中修改后的数据为:"+user.getUserName());
    user.setUserName("原始数据");
    System.out.println("数据库中最后修改的数据为:"+user.getUserName());
    tx.commit();
    session.close();

执行结果如下
这里写图片描述
可以发现在程序中我执行了多次修改操作,但控制台没有打印任何Update语句,为什么呢?

Hibernate向一级缓存放入数据时,同时复制一份数据到快照中,当使用commit语句提交事务时,同时会清理掉Session的一级缓存,这时会对比判断缓存中的对象和快照中的对象是否一致,如果两个对象属性发生了变化,则会执行update语句,将缓存的内容同步到数据库,并更新快照,如果一致,则不会执行update语句
快照的作用就是确保一级缓存中的数据和数据库中的数据一致
这里写图片描述

  • 总结
    hibernate的一级缓存就是指Session缓存,能够减少很多数据库操作,极大地提高了效率

    • 当应用程序调用Session接口的save(),update(),saveOrUpdate时,如果session缓存中没有相应的对象,hibernate就会自动的把从数据库中查询到的相应对象信息存入到一级缓存中去
    • 当调用Session接口的load(),get()方法,一级Query接口的list(),iterator()方法时,会判断缓存中是否存在该对象,有则返回,不会查询数据库,如果没有再去查询对应对象,并添加到一级缓存中。
    • 当调用Session的close()方法时,Session缓存会被清空
  • 一级缓存常用的API:

    • clear():清空一级缓存。
    • evict():清空一级缓存中指定的某个对象。
    • refresh():重新查询数据库,用数据库中的信息来更新一级缓存与快照区。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值