hibernate入门五之hibernate缓存

什么是缓存?

  • 并不是指计算机的内存或者cpu的一二级缓存
  • 缓存是指为了降低应用程序对物理数据源访问的频次,从而提高应用程序的运行性能的一种策略

为什么使用缓存?

  • ORM框架访问数据库的效率直接影响程序运行的速度,提升和优化ORM框架的执行效率至关重要。

  • Hibernate的缓存是提升和优化hibernate执行效率的重要手段,所以学会hibernate缓存的使用和配置是优化的关键

缓存的一般的工作原理

一级缓存

  • hibernate一级缓存又称之为“session缓存”、“会话级缓存”
  • 通过session从数据库查询实体时会把实体在内存中存储起来,下一次查询同一实体时不在从数据库中获取,而从内存中获取,这就是缓存
  • 一次缓存和的生命周期和session相同;session销毁,它也销毁
  • 一级缓存中的数据可适用范围在当前会话之内
  • 在不同的session多次查询同一数据,会执行多次数据库查询
  • 一级缓存中,持久化化的每个实例都具有唯一的OID

一级缓存API(一级缓存无法取消,用两个方法管理)

  1. evict(),用于将某个对象从session的一级缓存中清除
  2. 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中能够直接使用,而不用在次缓存怎么办?这时,我们的二级缓存就登场了!
二级缓存的配置步骤(默认不自动开启):

扫描二维码关注公众号,回复: 6404491 查看本文章
  • 二级缓存又称为“全局缓存”、“应用级缓存”
  • 二级缓存中的数据可适用范围是当前应用的所有会话
  • 二级缓存是可插拔式缓存,默认是ehcache,还支持其他的二级缓存:Hashtable,OSCache、等等

1、导入架包(ehcache及它所依赖的架包,版本根据自己的情况选)

2、配置ehcache.xml文件(参考地址:https://www.cnblogs.com/jeremy-blog/p/4021833.html)

3、在跟文件hibernate.cfg.xml指定二级缓存的入口

4、在指定实体类的hbm.xml中开启二级缓存

什么时候使用二级缓存?

  • 很少被修改的数据
  • 不是很重要的数据,允许偶尔出现并发的数据
  • 不会被并发访问的数据
  • 参考数据

一级缓存和二级缓存的对比和总结

猜你喜欢

转载自www.cnblogs.com/lindaiyu/p/11001363.html