我使用Spring Boot1.2.5和JPA2来注释实体( hibernate作为底层的JPA实现)。
我希望在该设置中使用二级缓存,因此使用@javax.persistence.Cacheable
注释实体
我还在application.properties中添加了以下内容:
spring.jpa.properties.hibernate.cache.use_second_level_cache=true
spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.EhCacheRegionFactory
在启动期间,hibernate抱怨缺少EhCacheRegionFactory
,所以我还在pom中添加了以下内容:
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-ehcache</artifactId>
</dependency>
但是,像entityManager.find(Clazz.class, pk)
这样的查询仍然触发了DB查询,而不是使用缓存数据。
你知道少了什么吗?
发布于 2015-07-23 22:36:26
经过进一步的挖掘,我在application.properties
中遗漏了以下内容
spring.jpa.properties.javax.persistence.sharedCache.mode=ALL
希望对某些人有帮助:)
发布于 2018-02-20 00:46:27
你有没有添加
@org.hibernate.annotations.Cache(usage = CacheConcurrencyStrategy.READ_ONLY)
在你想要缓存的类上?
发布于 2015-07-23 21:07:23
您的类路径中应该有一个ehcache.xml文件。该文件应至少包含默认缓存策略。为了更容易调试,请确保实体不会从缓存中逐出:
ehcache.xml:
<ehcache xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:noNamespaceSchemaLocation="ehcache.xsd"
Name="CacheManager"
maxBytesLocalHeap="250m">
<defaultCache eternal="true"
...
/>
<cache name="org.hibernate.cache.internal.StandardQueryCache"
eternal="true"
...
/>
为了确保一切正常,您应该在应用程序启动期间记录以下日志:
Could not find a specific ehcache configuration for cache named [com.yourcompany.YourClass]; Using defaults.
这意味着您的实体缓存注释已被正确读取,并将使用默认缓存。
如果您使用entityManager.find(Clazz.class, pk)
进行测试,则不会将查询缓存包含在内,而只是将实体缓存包含在内。查询缓存用于查询(em.createQuery(...)对于关系船来说
另外,我使用org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory,,但我不知道哪个更好。
https://stackoverflow.com/questions/31585698
复制相似问题