Hibernate 缓存

Hibernate 缓存

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

ORM 框架访问数据库的效率直接影响应用程序的运行速度,提升和优化 ORM 框架的执行效率至关重要。而 Hibernate 的缓存是提升和优化 Hibernate 执行效率的关键。

Hibernate 缓存在提高检索效率的同时,也会增强服务器的消耗,可能会对程序的性能产生影响,所以要注意缓存的使用策略。

一级缓存

一级缓存又称为 Session 缓存、会话级缓存。

通过 Session 从数据库查询实体时会把实体存储在内存中,下一次查询同一实体时不再从数据库获取,而从内存中获取,这就是缓存。

一级缓存的生命周期和 Session 相同,当 Session 销毁时,缓存也失效。因此,一级缓存的数据可适用范围在当前会话之内。

一级缓存无法取消,可通过以下两个方法管理:
evict():用于将某个对象从 Session 的一级缓存中清除
clear():用于将一级缓存中的所有对象全部清除

比较query.list()query.iterate()
返回对象返回持久化实体类对象 List返回代理对象 Iterate
查询策略直接发送 SQL 语句到数据库查询先发送 SQL 语句查询 id,然后从缓存中根据 id 查询实体,若命中则返回结果;未命中就根据 id 发送 SQL 语句到数据库查询
缓存会缓存,但不使用缓存会使用缓存

二级缓存

二级缓存又称为全局缓存、应用级缓存。二级缓存允许 session 共用。

二级缓存是可插拔式缓存,默认实现是 EHCache。也支持 OSCache、SwarmCache、JBoss Cache。

配置 EHCache 3.x 缓存

  1. 添加二级缓存依赖包 EHCache
        <!-- EHCache -->
        <dependency>
            <groupId>org.ehcache</groupId>
            <artifactId>ehcache</artifactId>
            <version>3.7.1</version>
        </dependency>

        <!-- JCache -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-jcache</artifactId>
            <version>5.4.3.Final</version>
        </dependency>
  1. 添加二级缓存的属性配置文件 ehcache.xml
<ehcache>
    <diskStore path="java.io.tmpdir"/>

    <defaultCache
            maxElementsInMemory="10000"
            eternal="false"
            timeToIdleSeconds="120"
            timeToLiveSeconds="120"
            overflowToDisk="true">
    </defaultCache>
</ehcache>
  1. 在 Hibernate 配置文件中配置二级缓存
        <!-- 开启二级缓存 -->
        <property name="cache.use_second_level_cache">true</property>
        <!-- 开启查询缓存 -->
        <property name="cache.use_query_cache">true</property>
        <!-- 配置二级缓存实现类 -->
        <property name="hibernate.javax.cache.provider">org.ehcache.jsr107.EhcacheCachingProvider</property>
        <property name="cache.region.factory_class">org.hibernate.cache.jcache.internal.JCacheRegionFactory</property>
  1. 在需要被缓存的表所对应的映射文件中添加 标签
<?xml version="1.0" encoding='UTF-8'?>
<!DOCTYPE hibernate-mapping PUBLIC
        "-//Hibernate/Hibernate Mapping DTD 3.0//EN"
        "http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
<hibernate-mapping package="com.chen.hibernate.model">
    <class name="Employee" table="employee">
        <cache usage="read-only"/>

        <id name="id" column="id" type="java.lang.Integer">
            <generator class="identity"/>
        </id>
        <property name="name" column="name" type="java.lang.String"/>
        <property name="salary" column="salary" type="java.math.BigDecimal"/>
    </class>
</hibernate-mapping>

标签

  • usage:指定缓存策略
    • transactional - 为主读数据使用这个策略
    • read-write - 为主读数据再一次使用这个策略
    • nonstrict-read-write - 不保证缓存和数据库之间的一致性
    • read-only - 适合永不改变数据的并发策略
  • region:指定二级缓存区域名
  • incluede:指定是否缓存延迟加载的对象
    • all - 缓存所有对象
    • non-lazy - 不缓存延迟加载的对象

Hibernate 缓存比较

比较一级缓存二级缓存
缓存范围事务范围,每个事务都拥有单独一级缓存应用范围,当前应用内所有事务共享
并发访问策略必须提供适当的并发访问策略
数据过期策略缓存对象的最大数目、最长时间、最长空闲时间等
缓存实现自带第三方提供,可插拔集成
物理介质内存内存和硬盘
启用方式默认启用,不可关闭默认不启用,选择性开启

参考

GitHub 代码
Hibernate缓存策略

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值