Hibernate缓存

1. 不使用缓存

<1>使用同一个session执行查询 对同个对象的第二次查询只是返回第一册查询结果 而不是重新使用SQL语句对数据库进行查询

2. 一级缓存(Session缓存)

  • 介绍
  1. 通过Session从数据库查询实体会把实体在内存中存储起来,下一次查询同一实体不再从数据库获取,而是从内存中获取
  2. 一级缓存的生命周期和Session相同
  • API
    一级缓存无法取消,用两个方法管理
    <1> evict(): 用于将某个对象从Session的一级缓存中清除
    <2> clear(): 用于将一级缓存中所有对象全部清除
  • 问题
    <1> query.list()不会使用到缓存
    <2> query.iterate() 执行流程是 查询对象的ID 然后根据Id到缓存中找 没有找到 自己到数据库中找

    3. 二级缓存

  • 介绍
    每个Session共享缓存,不是默认开启
  • 配置步骤
    <1>JAR导入
    <2>SRC -> ehcache.xml
    <3>hibernate.cfg.cml 配置二级缓存入口(指定二级缓存的外部实现类)
    <4>在对应实体类的配置文件中开启二级缓存
  • <4>
    事务模式 只读
    <cache usage="read-only" include="all或者non-lazy" region="任意名"
    non-lazy 当本表关联其他表的属性时 不设置那个属性
    region对应的value可以在ehcache.xml中对应标签 设置他的缓存策略(最大缓存数量,缓存对象永久)

4. 二级缓存 & 一级缓存

  • 试用情况
    <1>很少被修改的数据

<2>不是很重要的数据,允许出现偶尔并发的数据

属性 | 一级缓存 | 二级缓存

---|--- | ---

缓存的范围|事务范围 每个事务都拥有单独一级缓存|应用范围,当前应用内所有事务共享

并发访问策略|不会出现并发问题|必须提供适当的并发访问策略

数据过期策略|没有数据过期策略|缓存对象的最大数目、最长时间、最长空闲时间等

缓存的软件实现|框架包含|第三方提供、可插拔集成

物理介质|内存|内存和硬盘

启用方式|默认启用、不可关闭|默认不启用、选择性开启

5. 缓存算法

LRU Least Recently Used
LFU Least Frequently Used
FIFO First In First Out

猜你喜欢

转载自www.cnblogs.com/Coeus-P/p/8999145.html