HoRain云--Hibernate二级缓存配置与优化指南

🎬 HoRain云小助手:个人主页
🔥 个人专栏: 《Linux 系列教程》《c语言教程》
⛺️生活的理想,就是为了理想的生活!
⛳️ 推荐
前些天发现了一个超棒的服务器购买网站,性价比超高,大内存超划算!忍不住分享一下给大家。点击跳转到网站。
专栏介绍
|
专栏名称 |
专栏介绍 |
|
本专栏主要撰写C干货内容和编程技巧,让大家从底层了解C,把更多的知识由抽象到简单通俗易懂。 |
|
|
本专栏主要是注重从底层来给大家一步步剖析网络协议的奥秘,一起解密网络协议在运行中协议的基本运行机制! |
|
|
全面深入解析 docker 容器,从基础到进阶,涵盖原理、操作、实践案例,助您精通 docker。 |
|
|
本专栏主要撰写Linux干货内容,从基础到进阶,知识由抽象到简单通俗易懂,帮你从新手小白到扫地僧。 |
|
|
本专栏着重撰写Python相关的干货内容与编程技巧,助力大家从底层去认识Python,将更多复杂的知识由抽象转化为简单易懂的内容。 |
|
|
本专栏主要是发布一些考试和练习题库(涵盖软考、HCIE、HRCE、CCNA等) |
目录

Hibernate 的二级缓存是 SessionFactory 级别的缓存,它可以被所有由同一个 SessionFactory 创建的 Session 共享。合理使用二级缓存能显著减少数据库访问次数,提升应用程序性能,尤其是在读取操作远多于写入操作的场景下。
下面这张表格汇总了 Hibernate 二级缓存的核心特性,方便你快速把握全局:
|
特性 |
说明 |
|---|---|
|
缓存级别 |
SessionFactory 级别 |
|
生命周期 |
与 SessionFactory 一致(应用进程范围) |
|
共享范围 |
所有由同一 SessionFactory 创建的 Session 共享 |
|
物理介质 |
内存、硬盘(取决于缓存提供商,如 EhCache) |
|
适用数据 |
读取频繁、修改很少、非关键性数据(如参考数据) |
|
并发策略 |
提供多种策略(如 read-only, read-write)应对并发访问 |
🔄 二级缓存的工作过程
Hibernate 访问数据时,查询顺序通常是:
-
首先查找一级缓存(Session 级别)
-
如果一级缓存未命中且配置了二级缓存,则查找二级缓存
-
如果二级缓存也未命中,才查询数据库
-
查询到的结果会被同时放入一级和二级缓存中
当执行增、删、改操作时,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"/>
⚖️ 选择缓存并发策略
为实体类选择缓存策略时,主要考虑数据的读写比例和一致性要求:
|
策略 |
适用场景 |
特点 |
|---|---|---|
|
|
绝不会被修改的数据 |
性能最佳,但数据不能更改 |
|
|
经常被读、偶尔被写的数据 |
保证读写事务隔离,常用 |
|
|
数据可能被异步修改,偶尔脏读可接受 |
不严格保证缓存与数据库一致性 |
|
|
在 JTA 环境下需要完全事务支持 |
提供最高级别的一致性保证 |
⚠️ 重要注意事项
-
慎重选择缓存数据
-
适合缓存:读取频繁、修改很少的数据(如系统配置、商品分类、历史归档数据)。
-
不适合缓存:财务数据、经常变动的数据、与其他应用共享的数据 。
-
-
查询缓存需单独设置
即使配置了二级缓存,对于
createQuery等条件查询,默认也不会使用缓存。需要显式调用query.setCacheable(true)。 -
集合缓存需要额外配置
如果缓存一个包含其他实体集合的类(如
Department包含Employee集合),需要为集合也配置缓存,否则查询集合时依然会访问数据库 。 -
集群环境下的考虑
在集群环境中部署时,需要配置支持分布式的缓存提供商(如 Infinispan、Redis),并确保缓存数据在各个节点间同步 。
💡 性能优化建议
-
监控缓存命中率:使用缓存提供商提供的监控工具,观察缓存命中情况,作为调整缓存策略的依据。
-
合理设置缓存大小和过期时间:根据业务特点和数据量,在
ehcache.xml中调整maxElementsInMemory、timeToIdleSeconds等参数,避免内存溢出或缓存僵死。 -
二级缓存并非万能:对于写入非常频繁的场景,维护缓存可能带来额外开销,需谨慎评估。
正确配置和使用 Hibernate 二级缓存,能有效降低数据库负载,提升系统响应速度。建议你在理解原理的基础上,结合具体业务需求进行测试和调整。
❤️❤️❤️本人水平有限,如有纰漏,欢迎各位大佬评论批评指正!😄😄😄
💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍
🔥🔥🔥Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧!🌙🌙🌙
更多推荐




所有评论(0)