2 回答
TA貢獻1895條經驗 獲得超3個贊
我想我找到了問題的原因 - 您沒有指定ehcache.xml文件的位置:
spring:
jpa:
properties:
hibernate:
javax.cache:
provider: org.ehcache.jsr107.EhcacheCachingProvider
uri: classpath:ehcache.xml
cache:
use_second_level_cache: true
region.factory_class: jcache
use_query_cache: true
在這種情況下,Hibernate 使用默認配置創建緩存。我的演示項目日志中的一個片段:
17:15:19 WARN [main] org.hibernate.orm.cache: HHH90001006: Missing cache[user] was created on-the-fly. The created cache will use a provider-specific default configuration: make sure you defined one. You can disable this warning by setting 'hibernate.javax.cache.missing_cache_strategy' to 'create'.
TA貢獻1890條經驗 獲得超9個贊
當您@Cacheable在實體頂部設置注釋時,它會創建一個區域,其中KEY是ID實體的,Value是實體。上面的意思是,如果您通過密鑰訪問,您將命中緩存ID。如果您使用 spring 數據和 findById,它將命中緩存。如果您創建一個方法 findByName,則訪問將不是按鍵 trerefore,因此它不會命中您的Cacheable注釋定義的緩存區域。另一方面,它會命中查詢緩存,但查詢緩存位于完全不同的區域。從您的配置來看,您根本沒有配置查詢緩存。要使此方法完全命中任何緩存,您需要使用此屬性添加它:
spring:jpa:properties:hibernate:cache:use_query_cache: true
或者,您可以在存儲庫方法之上指定@Cacheable,這樣可以定義一個新區域。
您可以配置默認緩存,這應該捕獲 StandardQueryCahache。
<defaultCache
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600">
</defaultCache>
在 EhCache2 中,您可以通過此元素配置標準查詢緩存:
<cache
name="org.hibernate.cache.internal.StandardQueryCache"
maxElementsInMemory="10000"
eternal="false"
timeToIdleSeconds="3600"
timeToLiveSeconds="3600">
雖然不確定它在 ehcache 3 中的表現如何。我相信它應該是一樣的,因為 StandartQueryCache 類是 hibernate 包的一部分,而不是 ehcache 包的一部分。
我還認為你需要設置
hibernate.javax.cache.provider = org.ehcache.jsr107.EhcacheCachingProvider
添加回答
舉報
