Hibernate一二级缓存与Ehcache/Redis等外部缓存的适配及配置问询
Hibernate/JPA 外部缓存与两级缓存的适配问题解答
嘿,我来帮你理清楚Hibernate/JPA里外部缓存和两级缓存的关系,这其实是个挺常见的疑惑,咱们一步步拆解:
1. Redis/Ehcache这类外部缓存的定位
首先得明确:Hibernate的二级缓存是一个抽象的缓存层级,它本身并没有自带具体的存储实现——而Redis、Ehcache这类外部缓存,就是用来填充这个抽象层级的具体实现方案。
换句话说,它们就属于Session Factory层级的二级缓存范畴,是二级缓存的“底层存储引擎”,而不是独立于两级缓存架构之外的东西。
2. 要不要禁用二级缓存才能用Redis/Ehcache?
完全不需要!反而你得主动开启二级缓存,再配置它使用Redis或Ehcache作为具体实现。两者是配合关系,不是互斥的:二级缓存是规则和抽象接口,外部缓存是落地的存储载体,缺了哪一个都没法正常工作。
3. 外部缓存与两级缓存的适配配置方式
确实有多种配置方式,主要分这几类:
方式一:通过Hibernate核心配置文件(hibernate.cfg.xml)配置
首先开启二级缓存:
<property name="hibernate.cache.use_second_level_cache">true</property>
然后指定缓存提供者(也就是外部缓存的工厂类),比如:
- 用Ehcache的话:
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</property>
- 用Redis的话(需要引入对应的Hibernate-Redis集成依赖):
<property name="hibernate.cache.region.factory_class">org.hibernate.cache.redis.RedisRegionFactory</property> <property name="hibernate.cache.redis.host">localhost</property> <property name="hibernate.cache.redis.port">6379</property>
方式二:通过JPA的persistence.xml配置
如果是用JPA封装Hibernate,在persistence.xml里做类似配置:
<persistence-unit name="yourPU"> <!-- 其他配置 --> <properties> <property name="hibernate.cache.use_second_level_cache" value="true"/> <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> <!-- 对应外部缓存的其他参数 --> </properties> </persistence-unit>
方式三:针对实体类配置缓存策略
光开启全局二级缓存还不够,你得指定哪些实体要被缓存。可以用注解:
- JPA标准注解
@Cacheable:
@Entity @Cacheable public class User { // 实体字段 }
- Hibernate扩展的
@Cache来指定缓存策略(比如读写、只读等):
@Entity @Cacheable @Cache(usage = CacheConcurrencyStrategy.READ_WRITE) public class User { // 实体字段 }
最后补充一句:一级缓存(Session级)是默认开启的,它和二级缓存完全不冲突。当你通过Session查询实体时,会先查一级缓存,找不到再查二级缓存,还找不到才去查数据库;查询结果会同时放入一级缓存(当前Session有效)和二级缓存(所有Session共享,直到缓存失效)。
内容的提问来源于stack exchange,提问作者user14305942
相关产品推荐
相关产品推荐

