Hibernate的一级缓存
程序员文章站
2022-06-19 13:53:32
...
—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
对象,并且可以发现user1
和user2
两个对象是相等的
- 缓存原理
- 快照
执行如下代码:
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():重新查询数据库,用数据库中的信息来更新一级缓存与快照区。