【问题标题】:HHH90001006: Missing cache[default-update-timestamps-region] was created on-the-flyHHH90001006:缺少缓存 [default-update-timestamps-region] 是即时创建的
【发布时间】:2021-08-31 17:29:22
【问题描述】:

一个简单的Spring Boot 2.5 application,带有 EhCache 3 的 Spring Data JPA 和启用了查询和二级缓存的 Hibernate 5:

spring.jpa.properties.hibernate.cache.use_query_cache=true
spring.jpa.properties.hibernate.cache.use_second_level_cache=true

在启动时为每个缓存生成来自 Hibernate 的警告和来自 EhCache 的信息消息:

WARN org.hibernate.orm.cache          HHH90001006: Missing cache[default-update-timestamps-region] 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'.
INFO org.ehcache.core.EhcacheManager  Cache 'default-update-timestamps-region' created in EhcacheManager.

WARN org.hibernate.orm.cache          HHH90001006: Missing cache[default-query-results-region] 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'.
INFO org.ehcache.core.EhcacheManager  Cache 'default-query-results-region' created in EhcacheManager.

这些 Hibernate 缓存的正确 EhCache 配置是什么?

【问题讨论】:

    标签: java spring hibernate caching ehcache


    【解决方案1】:

    这里有一个很好的解释:https://www.ehcache.org/documentation/2.8/integrations/hibernate.html#configure-

    如果您希望这些警告消失,您可以在 ehcache.xml 中明确定义缓存,或者使用 create 配置值作为警告日志。

    【讨论】:

    • 我重写了这个问题,使其更加清晰/直接。问题是这些 Hibernate 缓存的正确 EhCache 配置是什么……所以首先是 Hibernate 需要什么,然后是如何使用 EhCache 3 实现的问题。
    • 正确是什么意思?只需添加例如<cache name="default-update-timestamps-region"/><cache name="default-query-results-region"/> 到 ehcache.xml。如果您想知道要配置哪些值,请查看 wildfly 在其 standalone-ha.xml 中为 <cache-container name="hibernate"/> 配置的内容。
    • 这里的关键是根据Hibernate禁用时间戳缓存的过期。
    【解决方案2】:

    Disable expiration on the default-update-timestamps-region cache as recommended by Hibernate:

    @Configuration @EnableCaching
    public class ApplicationConfiguration {
        @Bean
        public CacheManager ehCacheManager() {
            CacheManager cacheManager = Caching.getCachingProvider().getCacheManager();
    
            hibernateDefaultUpdateTimestampsRegionConfiguration(cacheManager);
            hibernateDefaultQueryResultsRegion(cacheManager);
    
            return cacheManager;
        }
    
        /**
         * Create Hibernate's default-update-timestamps-region cache. No expiration per Hibernate recommendation:
         * https://github.com/hibernate/hibernate-orm/blob/main/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc#query-cache-regions
         *
         * @param cacheManager
         */
        private void hibernateDefaultUpdateTimestampsRegionConfiguration(CacheManager cacheManager) {
            CacheConfigurationBuilder<Object, Object> builder = CacheConfigurationBuilder
                    .newCacheConfigurationBuilder(Object.class, Object.class,
                            ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(1, MemoryUnit.MB));
    
            javax.cache.configuration.Configuration<Object, Object> cache = Eh107Configuration.fromEhcacheCacheConfiguration(builder);
    
            cacheManager.createCache("default-update-timestamps-region", cache);
    
            //cacheManager.createCache("default-update-timestamps-region", new MutableConfiguration<>());
        }
    
        /**
         * Create Hibernate's default-query-results-region cache.
         * https://github.com/hibernate/hibernate-orm/blob/main/documentation/src/main/asciidoc/userguide/chapters/caching/Caching.adoc#query-cache-regions
         *
         * @param cacheManager
         */
        private void hibernateDefaultQueryResultsRegion(CacheManager cacheManager) {
            CacheConfigurationBuilder<Object, Object> builder = CacheConfigurationBuilder
                    .newCacheConfigurationBuilder(Object.class, Object.class,
                            ResourcePoolsBuilder.newResourcePoolsBuilder().offheap(1, MemoryUnit.MB));
    
            javax.cache.configuration.Configuration<Object, Object> cache = Eh107Configuration.fromEhcacheCacheConfiguration(builder);
    
            cacheManager.createCache("default-query-results-region", cache);
    
            //cacheManager.createCache("default-query-results-region", new MutableConfiguration<>());
        }
    
    }
    
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-04-03
      • 2019-09-16
      • 2023-04-06
      • 2020-02-07
      相关资源
      最近更新 更多