And*_*vin 7 spring hibernate ehcache
我正在尝试为基于 Hibernate 5.3 和 Spring Boot 2.1.3 并使用 Hibernate 二级缓存工作的应用程序编写测试。
当我执行设置 spring 上下文并尝试更新某些 JPA 实体的批量测试时,在某些时候会出现如下异常:
org.springframework.dao.InvalidDataAccessApiUsageException: Cache[default-update-timestamps-region] is closed; nested exception is java.lang.IllegalStateException: Cache[default-update-timestamps-region] is closed
at org.springframework.orm.jpa.EntityManagerFactoryUtils.convertJpaAccessExceptionIfPossible(EntityManagerFactoryUtils.java:370)
at org.springframework.orm.jpa.vendor.HibernateJpaDialect.translateExceptionIfPossible(HibernateJpaDialect.java:255)
at org.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:536)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.processCommit(AbstractPlatformTransactionManager.java:746)
at org.springframework.transaction.support.AbstractPlatformTransactionManager.commit(AbstractPlatformTransactionManager.java:714)
at org.springframework.transaction.interceptor.TransactionAspectSupport.commitTransactionAfterReturning(TransactionAspectSupport.java:533)
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:304)
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:139)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:135)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.data.repository.core.support.SurroundingTransactionDetectorMethodInterceptor.invoke(SurroundingTransactionDetectorMethodInterceptor.java:61)
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:212)
at com.sun.proxy.$Proxy244.save(Unknown Source)
Run Code Online (Sandbox Code Playgroud)
我对 Hibernate 二级缓存有以下配置:
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.jcache.JCacheRegionFactory
spring.jpa.properties.javax.persistence.sharedCache.mode=ENABLE_SELECTIVE
并使用 Hibernate JCache 作为依赖项。
据我了解,对 org.hibernate.cache.jcache.JCacheRegionFactorySpring Test 创建的所有上下文重用相同的 EhCache CacheManager 实例,但一段时间后 Spring 关闭缓存上下文,这会导致 CacheManager 和缓存关闭。
以前,Hibernate(Hibernate EhCache 模块)提供了 org.hibernate.cache.ehcache.EhCacheRegionFactory 工厂,它每次都会创建新的 CacheManager,并且不存在上述问题。
有谁知道如何为每个 Spring 测试上下文创建新的 CacheManager 并避免使用共享的?
解决此问题的一个可能的解决方法是@DirtiesContext在您的类中添加如下内容:
@DirtiesContext(classMode = DirtiesContext.ClassMode.BEFORE_CLASS)
public class SomeTestClass {
...
}
Run Code Online (Sandbox Code Playgroud)
这将迫使 Spring 为此类的所有方法创建一个新的应用程序上下文。就我而言,这解决了问题。
另一种方法是确保 Spring 知道 Hibernate 缓存管理器。这可以像这篇博文中描述的那样来实现。然而,在某些情况下这可能是不可能的。
| 归档时间: |
|
| 查看次数: |
3157 次 |
| 最近记录: |