什么是缓存?
- 并不是指计算机的内存或者cpu的一二级缓存
- 缓存是指为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能的一种策略
为什么使用缓存?
-
ORM框架访问数据库的效率直接影响程序运行的速度,提升和优化ORM框架的执行效率至关重要。
- Hibernate的缓存是提升和优化hibernate执行效率的重要手段,所以学会hibernate缓存的使用和配置是优化的关键
缓存的一般的工作原理
一级缓存
- hibernate一级缓存又称之为“session缓存”、“会话级缓存”
- 通过session从数据库查询实体时会把实体在内存中存储起来,下一次查询同一实体时不在从数据库中获取,而从内存中获取,这就是缓存
- 一次缓存和的生命周期和session相同;session销毁,它也销毁
- 一级缓存中的数据可适用范围在当前会话之内
- 在不同的session多次查询同一数据,会执行多次数据库查询
- 一级缓存中,持久化化的每个实例都具有唯一的OID
一级缓存API(一级缓存无法取消,用两个方法管理)
- evict(),用于将某个对象从session的一级缓存中清除
- clear(),用于将一级缓存中的所有对象全部清除
一级缓存有时候对于程序的性能产生影响
public class SessionTest {
/**
* @param "测试一级缓存"
*/
public static void main(String[] args) {
Session session = HibernadUtil.getSession();
// Students students = session.get(Students.class, 31);
// System.out.println(students.getSname());
//
// //session.evict(students);// 清除缓存
// session.clear();// 清除所有缓存
//Session session1 = HibernadUtil.getSession(); //新的session
// students = session.get(Students.class, 31);
// System.out.println(students.getSname());
Query query = session.createQuery("from Students ");
List<Students> list = query.list();
for (Students student : list) {
System.out.println(student);
}
/*list不会用到当前会话中的session,依然会从数据库中查找*/
// list = query.list();
// for (Students student : list) {
// System.out.println(student);
// }
/*
*干掉
* List<Students> list = query.list();
// for (Students student : list) {
// System.out.println(student);
// }
* 从雇员表中查取学生编号,如果在缓存中找到了,从缓存中拿,否则从缓存中拿
* */
Iterator iterator = query.iterate();
while (iterator.hasNext()) {
Object student = (Students) iterator.next();
System.out.println(((Students) student).getSname());
}
session.close();
}
}
二级缓存
有些常用的数据,在一个session中缓存以后,我们希望在其他session中能够直接使用,而不用在次缓存怎么办?这时,我们的二级缓存就登场了!
二级缓存的配置步骤(默认不自动开启):
- 二级缓存又称为“全局缓存”、“应用级缓存”
- 二级缓存中的数据可适用范围是当前应用的所有会话
- 二级缓存是可插拔式缓存,默认是ehcache,还支持其他的二级缓存:Hashtable,OSCache、等等
1、导入架包(ehcache及它所依赖的架包,版本根据自己的情况选)
2、配置ehcache.xml文件(可以hibernate的etc中获取)
3、在跟文件hibernate.cfg.xml指定二级缓存的入口
4、在指定实体类的hbm.xml中开启二级缓存
什么时候使用二级缓存?
- 很少被修改的数据
- 不是很重要的数据,允许偶尔出现并发的数据
- 不会被并发访问的数据
- 参考数据
一级缓存和二级缓存的对比和总结