我有一个多模块的应用程序。我将hibernate jcache添加到数据库模块中,以下是我的依赖项:
implementation "org.hibernate:hibernate-envers:$hibernateVersion"
implementation "org.hibernate:hibernate-jcache:$hibernateVersion"
implementation "org.ehcache:ehcache:$ehcacheVersion"
我的 ehcache.xml
:
<service>
<jcache:defaults enable-management="true" enable-statistics="true"/>
</service>
<cache-template name="defaultTemplate">
<expiry>
<ttl unit="seconds">1800</ttl>
</expiry>
<resources>
<heap unit="entries">100000</heap>
</resources>
</cache-template>
<cache alias="allowedCategory" uses-template="defaultTemplate"/>
以及 application.yml
与缓存相关的数据库模块属性:
hibernate:
cache:
region:
factory_class: org.hibernate.cache.jcache.JCacheRegionFactory
use_query_cache: true
use_second_level_cache: true
generate_statistics: true
javax:
cache:
missing_cache_strategy: create
provider: org.ehcache.jsr107.EhcacheCachingProvider
uri: ${new org.springframework.core.io.ClassPathResource("/ehcache.xml").getURI().toString()}
我为每个实体添加了注解,并为数据库模块的配置类添加了@enablecaching:
@Cacheable
@Cache(usage = CacheConcurrencyStrategy.READ_WRITE, region = "allowedCategory")
而且这些实体中的每一个都有uid字段,所以我在公共存储库类中的findbyuid方法上添加了查询提示注解 @QueryHints(value = @QueryHint(name = HINT_CACHEABLE, value = "true"))
.
第二个模块是一个spring批处理应用程序,它处理大型csv文件,我没有改变这个模块,只有数据库。在没有缓存的情况下,应用程序处理文件的时间为5个小时,现在是这个时间的一半。但是现在我有一个问题,批量应用程序的集成测试不起作用,即使我添加了 application.properties
以下属性:
spring.jpa.properties.hibernate.cache.use_second_level_cache=false
spring.jpa.properties.hibernate.cache.use_query_cache=false
spring.cache.type=none
我有outofmemoryerror,因为 java.util.concurrent.ConcurrentHashMap$Node
元素,其数量在集成测试期间增长。我试着把ttl单位设置为1秒,但是没有用,所以我认为问题出在另一个地方。如何在测试期间禁用缓存,或者有更好的解决方案吗?
暂无答案!
目前还没有任何答案,快来回答吧!