上一篇
hibernate二级缓存
- 行业动态
- 2025-05-11
- 2
Hibernate二级缓存是跨Session的共享缓存,用于减少数据库访问,提升性能,通常集成第三方缓存框架(如Ehcache、Redis),需配置缓存策略并处理数据一致性,适用于极少
核心概念
特性 | 描述 |
---|---|
缓存层级 | 二级缓存属于SessionFactory级别,所有Session共享同一份缓存数据 |
持久化对象的ID及快照(非对象实例),需配合一级缓存使用 | |
生命周期 | 随SessionFactory创建而初始化,随其关闭而销毁 |
可选性 | 默认关闭,需手动开启并配置缓存提供商 |
工作原理
数据流程
当执行数据查询时,Hibernate按以下顺序查找数据:- 一级缓存(Session级):优先从当前Session的缓存中获取数据。
- 二级缓存(SessionFactory级):若一级缓存未命中,则查询二级缓存。
- 数据库:若二级缓存也未命中,则从数据库加载数据并写入二级缓存。
缓存同步机制
- 插入/更新/删除操作:自动清除受影响数据的二级缓存(根据
cache
属性配置)。 - 脏数据检查:通过版本号(如
@Version
)或时间戳检测数据是否被修改。
- 插入/更新/删除操作:自动清除受影响数据的二级缓存(根据
配置步骤
启用二级缓存
在hibernate.cfg.xml
或application.properties
中添加:
<property name="hibernate.cache.use_second_level_cache">true</property> <property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
配置缓存区域
通过@Cache
注解或XML配置指定缓存策略:
@Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) // 支持读写 public class User { ... }
选择缓存提供商
缓存类型 | 特点 | 适用场景 |
---|---|---|
Ehcache | 本地内存缓存,轻量级 | 单机应用 |
Redis | 分布式缓存,支持集群 | 高并发、多节点环境 |
OSCache | 简单易用,基于内存 | 小型项目 |
Hazelcast | 内存+磁盘混合存储,支持集群 | 大规模分布式系统 |
适用场景与注意事项
适用场景
- 高频读、低频写:如用户信息、商品分类数据。
- 数据一致性要求低:允许一定时间的数据延迟(如日志、统计类数据)。
- 集群环境:需搭配分布式缓存(如Redis)实现多节点共享。
不适用场景
- 频繁更新的数据:如订单状态、实时库存。
- 高度敏感数据:如金融交易记录(需结合缓存过期策略)。
- 非静态数据:动态生成的内容或依赖复杂计算的数据。
常见问题
- 缓存雪崩:大量缓存同时失效导致数据库压力骤增。
解决方案:随机设置缓存过期时间,避免集中失效。 - 缓存穿透:查询不存在的数据导致穿透到数据库。
解决方案:使用布隆过滤器(BloomFilter)拦截无效请求。 - 缓存击穿:热点数据过期后并发请求直接打到数据库。
解决方案:加锁排队,仅允许单个线程加载数据并回填缓存。
配置示例(Spring Boot + Redis)
添加依赖
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-redis</artifactId> </dependency> <dependency> <groupId>org.hibernate</groupId> <artifactId>hibernate-core</artifactId> </dependency>
配置Redis缓存
@Configuration @EnableCaching public class CacheConfig { @Bean public CacheManager cacheManager() { RedisCacheConfiguration config = RedisCacheConfiguration.defaultCacheConfig() .entryTtl(Duration.ofHours(1)) // 设置默认过期时间 .disableCachingNullValues(); // 禁止缓存空值 return RedisCacheManager.builder(redisConnectionFactory()) .cacheDefaults(config) .build(); } }
实体类缓存配置
@Entity @Cacheable(value = "userCache", cacheManager = "cacheManager") public class User { @Id private Long id; // 其他字段... }
FAQs
Q1:二级缓存与一级缓存的区别是什么?
A1:
- 作用范围:一级缓存是Session级别的,仅当前Session可用;二级缓存是SessionFactory级别的,所有Session共享。
- :一级缓存存储对象实例,二级缓存存储ID及快照。
- 生命周期:一级缓存随Session关闭而销毁;二级缓存随SessionFactory关闭而销毁。
Q2:如何选择二级缓存产品?
A2:
- 单机应用:优先选择Ehcache(轻量、本地化)。
- 分布式系统:使用Redis或Hazelcast(支持多节点数据同步)。
- 高性能需求:考虑内存型缓存(如Caffeine)或混合存储方案(如Hazelcast)。