总结一下(包括L2缓存和查询缓存):
第一件事是将缓存提供程序(我建议使用EhCache)添加到您的类路径中。
Hibernate < 5.3
添加hibernate-ehcache
依赖项。该库包含已停止支持的EhCache 2。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
<version>your_hibernate_version</version>
</dependency>
Hibernate >=5.3
新版的Hibernate应该使用实现JSR-107(JCache)API的缓存。因此需要两个依赖项,一个是JSR-107 API,另一个是实际的JCache实现(EhCache 3)。
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-jcache</artifactId>
<version>your_hibernate_version</version>
</dependency>
<dependency>
<groupId>org.ehcache</groupId>
<artifactId>ehcache</artifactId>
<version>3.6.3</version>
<scope>runtime</scope>
</dependency>
现在让我们转到application.properties/yml文件:
spring:
jpa:
show-sql: true
properties:
javax:
persistence:
sharedCache:
mode: ENABLE_SELECTIVE
hibernate:
format_sql: true
generate_statistics: true
cache:
use_second_level_cache: true
use_query_cache: true
region:
factory_class: org.hibernate.cache.ehcache.EhCacheRegionFactory
对于EhCache 3(或Hibernate >=5.3),应该使用此区域工厂:
factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
你还可以启用Hibernate的TRACE级别日志记录来验证你的代码和配置:
logging:
level:
org:
hibernate:
type: trace
现在让我们进入代码。要在您的实体上启用L2缓存,您需要添加这两个注释:
@javax.persistence.Cacheable
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_WRITE)
public class MyEntity {
...
}
注意 - 如果你想缓存你的@OneToMany
或@ManyToOne
关系 - 还需要在这个字段上添加@Cache
注释。
并且要启用Spring Data JPA仓库中的查询缓存,你需要添加正确的QueryHint
。
public class MyEntityRepository implements JpaRepository<MyEntity, Long> {
@QueryHints(@QueryHint(name = org.hibernate.annotations.QueryHints.CACHEABLE, value = "true"))
List<MyEntity> findBySomething(String something);
}
现在通过日志验证您的查询是否仅执行一次,并记得关闭所有调试内容 - 现在您已完成。
注2 - 您还可以将缺失的缓存策略定义为create
,如果您想保持默认设置而不在日志中收到警告:
spring:
jpa:
properties:
hibernate:
javax:
cache:
missing_cache_strategy: create
@EnableCaching
或在xml文件中使用<cache:annotation-driven />
启用了缓存管理。 - Arpit Aggarwal@javax.persistence.Cacheable
)。 - Daimon