JPA中的缓存分为一级缓存和二级缓存:
一级缓存:
- 一级缓存是EntityManager级别的缓存。同一个EntityManager加载的相同实体,会第2次直接从缓存中获取。
- 一级缓存与同一EntityManager下的事务相关联。事务提交或回滚,会清空缓存。
- 一级缓存默认开启,无需配置。
二级缓存:
- 二级缓存是SessionFactory级别的缓存。不同EntityManager加载的相同实体,会从二级缓存中获取。
- 二级缓存与EntityManager Factory相关联,其生命周期与Factory相同。
- 二级缓存需要手动配置映射文件或实体类才能开启。在映射文件中配置元素;或者在实体类上使用@Cacheable注解。
- 二级缓存使用Cache提供者实现,常见的有Ehcache、Infinispan等。需要指定对应的Cache提供者。
代码示例:
// 映射文件 cache 配置
<entity-mapping>
<caching usage="READ_ONLY"/>
</entity-mapping>
// 实体类 cache 配置
@Entity
@Cacheable
public class Product {
...
}
// 二级缓存使用 Ehcache
<property name="hibernate.cache.region.factory_class"
value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>