为什么实用缓存
目的是为了减少应用程序对物理数据源访问的次数,从而提高应用程序的运行性能.
hibernate如果使用了缓存,在查询数据时,首先到缓存中去查找,如果找到就直接使用,找不到的时候就会从物理数据源中检索,所以,把频繁使用的数据加载到缓存区后,就可以大大减少应用程序对物理数据源的访问,使得程序的运行性能明显的提升.
查询时使用缓存的实现过程为:首先查询一级缓存中是否具有需要的数据,如果没有,查询二级缓存,如果二级缓存中也没有,此时再执行查询数据库的工作。要注意的是:此3种方式的查询速度是依次降低的。
Hibernate缓存分为二级,第一级存放于session中称为一级缓存,默认带有且不能卸载。第二级是由sessionFactory控制的进程级缓存,称为二级缓存也称为进程级的缓存或SessionFactory级的缓存,二级缓存可以被所以的session共享。生命周期和SessionFactory生命周期一致,SessionFactory可以管理二级缓存。
一级缓存
一级缓存是缓存实体对象,Load/get/iterate查询实体对象支持一级缓存。
evit(Object obj) 将指定的持久化对象从一级缓存中清除,释放对象所占用的内存资源,指定对象从持久化状态变为脱管状态,从而成为游离对象.
clear() 将一级缓存中的所有持久化对象清除,释放其占用的内存资源
contains(Object obj) 判断指定的对象是否存在于一级缓存中.
flush() 刷新一级缓存区的内容,使之与数据库数据保持同步.
有一级缓存了为什么还要使用二级缓存
因为Session的生命期往往很短,存在于Session内部的第一级最快缓存的生命期当然也很短,所以第一级缓存的命中率是很低的。其对系统性能的改善也是很有限的。
二级缓存
二级缓存的实现原理与一级缓存是一样的,二级缓存也是缓存实体对象的。evict(Classarg0, Serializable arg1) 将某个类的指定ID的持久化对象从二级缓存中清除,释放对象所占用的资源.
什么时候适加载到二级缓存中:
1.数据更新频率低
2.允许偶尔出现并发问题的非重要数据
3.不会被并发访问的数据
4.常量数据
5.不会被第三方修改的数据
反之,下面情况就不适合使用二级缓存
1.经常被修改的数据
2.绝对不允许出现并发访问的数据
3.与其他应用共享的数据
一级缓存和二级缓存的交互,如可以禁止将一级缓存放到二级缓存里。
查询缓存
查询缓存默认是关闭的,不启用的。查询缓存是缓存普通属性结果集的,对实体对象的结果集会缓存id。生命周期是,当关联的表发生修改时,查询缓存的生命周期结束。不紧要在配置文件里开启查询缓存,在程序里也必须要启用。
hibernate中缓存的初步认识