🎬 HoRain云小助手个人主页

 🔥 个人专栏: 《Linux 系列教程》《c语言教程

⛺️生活的理想,就是为了理想的生活!


⛳️ 推荐

前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。

专栏介绍

专栏名称

专栏介绍

《C语言》

本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。

《网络协议》

本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制!

《docker容器精解篇》

全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。

《linux系列》

本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。

《python 系列》

本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。

《试题库》

本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等)

目录

⛳️ 推荐

专栏介绍

🔄 二级缓存的工作过程

📋 配置二级缓存的步骤

1. 添加依赖

2. 启用并指定二级缓存

3. 配置缓存提供商文件

4. 指定哪些实体类使用缓存

⚖️ 选择缓存并发策略

⚠️ 重要注意事项

💡 性能优化建议


img

Hibernate 的​​二级缓存​​是 SessionFactory 级别的缓存,它可以被所有由同一个 SessionFactory 创建的 Session 共享。合理使用二级缓存能显著减少数据库访问次数,提升应用程序性能,尤其是在读取操作远多于写入操作的场景下。

下面这张表格汇总了 Hibernate 二级缓存的核心特性,方便你快速把握全局:

​特性​

​说明​

​缓存级别​

SessionFactory 级别

​生命周期​

与 SessionFactory 一致(应用进程范围)

​共享范围​

所有由同一 SessionFactory 创建的 Session 共享

​物理介质​

内存、硬盘(取决于缓存提供商,如 EhCache)

​适用数据​

读取频繁、修改很少、非关键性数据(如参考数据)

​并发策略​

提供多种策略(如 read-only, read-write)应对并发访问

🔄 二级缓存的工作过程

Hibernate 访问数据时,查询顺序通常是:

  1. 首先查找​​一级缓存​​(Session 级别)

  2. 如果一级缓存未命中且配置了二级缓存,则查找​​二级缓存​

  3. 如果二级缓存也未命中,才查询​​数据库​

  4. 查询到的结果会被同时放入一级和二级缓存中

当执行增、删、改操作时,Hibernate 会​​同步更新或失效​​相关缓存数据,以保证数据一致性 。

📋 配置二级缓存的步骤

以下是以 EhCache 为例的常见配置方式:

1. 添加依赖

首先需要在项目中加入二级缓存实现的 JAR 包。例如使用 Maven 配置 EhCache 依赖:

<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-ehcache</artifactId>
    <version>你的Hibernate版本</version>
</dependency>
2. 启用并指定二级缓存

在 Hibernate 配置文件(如 hibernate.cfg.xml)中启用二级缓存并指定提供商:

<property name="hibernate.cache.use_second_level_cache">true</property>
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
<!-- 如果需要使用查询缓存,还需启用 -->
<property name="hibernate.cache.use_query_cache">true</property>
3. 配置缓存提供商文件

创建缓存提供商的配置文件,如 EhCache 的 ehcache.xml,放在类路径下(如 src/main/resources)。该文件用于设置缓存的详细参数:

<ehcache>
    <diskStore path="java.io.tmpdir"/>
    <defaultCache
        maxElementsInMemory="10000"
        eternal="false"
        timeToIdleSeconds="120"
        timeToLiveSeconds="120"
        overflowToDisk="true"
        diskPersistent="false"
    />
</ehcache>

关键参数说明:

  • maxElementsInMemory:内存中最大缓存对象数量。

  • eternal:缓存是否永恒不变(若为 true,则下面两个时间设置失效)。

  • timeToIdleSeconds:对象的空闲时间(秒),超过此时间可能被移除。

  • timeToLiveSeconds:对象的存活时间(秒),超过此时间可能被移除。

  • overflowToDisk:内存不足时是否溢出到磁盘。

4. 指定哪些实体类使用缓存

你需要明确指定哪些实体或集合需要被二级缓存。可以通过注解或 XML 映射文件配置。

  • ​注解方式​​(在实体类上):

    @Entity
    @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 指定缓存并发策略
    public class Product {
        // ... 实体类定义
    }
  • ​XML 映射文件方式​​(在 .hbm.xml文件中):

    <class name="Product" table="...">
        <cache usage="read-write"/>
        <!-- ... 其他映射 -->
    </class>
  • ​在 hibernate.cfg.xml中指定​​:

    <class-cache class="your.package.Product" usage="read-write"/>

⚖️ 选择缓存并发策略

为实体类选择缓存策略时,主要考虑数据的读写比例和一致性要求:

​策略​

​适用场景​

​特点​

read-only

绝不会被修改的数据

性能最佳,但数据不能更改

read-write

经常被读、偶尔被写的数据

保证读写事务隔离,常用

nonstrict-read-write

数据可能被异步修改,偶尔脏读可接受

不严格保证缓存与数据库一致性

transactional

在 JTA 环境下需要完全事务支持

提供最高级别的一致性保证

⚠️ 重要注意事项

  1. ​慎重选择缓存数据​

    • ​适合缓存​​:读取频繁、修改很少的数据(如系统配置、商品分类、历史归档数据)。

    • ​不适合缓存​​:财务数据、经常变动的数据、与其他应用共享的数据 。

  2. ​查询缓存需单独设置​

    即使配置了二级缓存,对于 createQuery等条件查询,默认也不会使用缓存。需要显式调用 query.setCacheable(true)

  3. ​集合缓存需要额外配置​

    如果缓存一个包含其他实体集合的类(如 Department包含 Employee集合),需要为集合也配置缓存,否则查询集合时依然会访问数据库 。

  4. ​集群环境下的考虑​

    在集群环境中部署时,需要配置支持分布式的缓存提供商(如 Infinispan、Redis),并确保缓存数据在各个节点间同步 。

💡 性能优化建议

  • ​监控缓存命中率​​:使用缓存提供商提供的监控工具,观察缓存命中情况,作为调整缓存策略的依据。

  • ​合理设置缓存大小和过期时间​​:根据业务特点和数据量,在 ehcache.xml中调整 maxElementsInMemorytimeToIdleSeconds等参数,避免内存溢出或缓存僵死。

  • ​二级缓存并非万能​​:对于写入非常频繁的场景,维护缓存可能带来额外开销,需谨慎评估。

正确配置和使用 Hibernate 二级缓存,能有效降低数据库负载,提升系统响应速度。建议你在理解原理的基础上,结合具体业务需求进行测试和调整。

❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍

🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐