当前位置:首页 > 行业动态 > 正文

hibernate二级缓存

Hibernate二级缓存是跨Session的共享缓存,用于减少数据库访问,提升性能,通常集成第三方缓存框架(如Ehcache、Redis),需配置缓存策略并处理数据一致性,适用于极少

核心概念

特性 描述
缓存层级 二级缓存属于SessionFactory级别,所有Session共享同一份缓存数据
持久化对象的ID及快照(非对象实例),需配合一级缓存使用
生命周期 随SessionFactory创建而初始化,随其关闭而销毁
可选性 默认关闭,需手动开启并配置缓存提供商

工作原理

  1. 数据流程
    当执行数据查询时,Hibernate按以下顺序查找数据:

    • 一级缓存(Session级):优先从当前Session的缓存中获取数据。
    • 二级缓存(SessionFactory级):若一级缓存未命中,则查询二级缓存。
    • 数据库:若二级缓存也未命中,则从数据库加载数据并写入二级缓存。
  2. 缓存同步机制

    hibernate二级缓存  第1张

    • 插入/更新/删除操作:自动清除受影响数据的二级缓存(根据cache属性配置)。
    • 脏数据检查:通过版本号(如@Version)或时间戳检测数据是否被修改。

配置步骤

启用二级缓存

hibernate.cfg.xmlapplication.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)。
0