在JPA中可以通过配置@Cacheable注解和cache区域实现二级缓存。
@Cacheable注解:
- 用于标记实体类,启用该实体的二级缓存。
- 当查询该实体时,会先查找缓存中是否存在数据,如果存在就直接返回缓存数据,否则查询数据库并将数据放入缓存。
cache区域:
- 在persistence.xml中配置,用于定义缓存的类型、大小等属性。
- JPA提供了以下3种缓存类型:
- L1:一级缓存,默认开启,需要自行定制属性、大小等信息。一级缓存存在于EntityManagerFactory中
- L2:二级缓存,可共享,存在于EntityManagerFactory中。需要手动配置
- EHcache:三方缓存,与JPA L2 API兼容。需要软件定制cache属性
persistence.xml配置cache区域示例:
<persistence-unit name="example">
<cache capacity="10000" name="exampleCache" type="infinispan"/>
<!-- other persistence unit properties -->
</persistence-unit>
@Cacheable注解示例:
@Entity
@Cacheable
public class Product { ... }
配置二级缓存的步骤:
- 在persistence.xml中定义cache区域。
- 使用@Cacheable注解标记实体类。
- 在查询方法上使用EntityManager的find()或createQuery()方法查询数据。
- 数据会首先在缓存中查找,如果存在就直接返回,否则查询数据库并存入缓存。
- 修改或删除数据时,需要清除对应的缓存数据,可以使用EntityManager的evict()方法。
二级缓存的优点:
- 减少数据库访问,提高读取性能。
- 缓存数据可共享,多个EntityManager可以访问。
需要注意缓存的数据一致性问题,可以通过删除或修改数据时清除缓存来解决。