我正在尝试将 SecondLevelCache 与休眠一起使用。这是我的 xml 配置文件:
<persistence-unit name="EntityTestHibernate" transaction-type="RESOURCE_LOCAL">
<properties>
<property name="hibernate.show_sql" value="false"/>
<property name="hibernate.format_sql" value="false"/>
<property name="hibernate.connection.url" value="jdbc:postgresql://localhost:5432/DB_NAME"/>
<property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect"/>
<property name="hibernate.connection.driver_class" value="org.postgresql.Driver"/>
<property name="hibernate.connection.username" value="USERNAME"/>
<property name="hibernate.connection.password" value="PASSWORD"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
<property name="hibernate.cache.provider_configuration_file_resource_path" value="/test/ehcache.xml" />
</properties>
</persistence-unit>
我的 ehcache.xml:
<ehcache name="cacheTest" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="http://ehcache.org/ehcache.xsd">
<defaultCache eternal="true" maxElementsInMemory="100" overflowToDisk="false" />
<cache name="entityCache"
maxEntriesLocalHeap="50"
eternal="false"
timeToLiveSeconds="120"
/>
</ehcache>
在我的实体上有这样的注释
@Cache(region="entityCache", usage=CacheConcurrencyStrategy.READ_WRITE )
当我运行 UnitTest 时,出现以下错误(如果我在其上设置或未在 @DirtiesContext 上进行注释,问题是相同的):
net.sf.ehcache.CacheException: Another CacheManager with same name 'cacheTest' already exists in the same VM. Please provide unique names for each CacheManager in the config or do one of following:
1. Use one of the CacheManager.create() static factory methods to reuse same CacheManager with same name or create one if necessary
2. Shutdown the earlier cacheManager before creating new one with same name.
The source of the existing CacheManager is: DefaultConfigurationSource [ ehcache.xml or ehcache-failsafe.xml ]
at net.sf.ehcache.CacheManager.assertNoCacheManagerExistsWithSameName(CacheManager.java:573)
at net.sf.ehcache.CacheManager.init(CacheManager.java:389)
at net.sf.ehcache.CacheManager.<init>(CacheManager.java:371)
at net.sf.ehcache.hibernate.EhCacheProvider.start(EhCacheProvider.java:93)
at org.hibernate.cache.impl.bridge.RegionFactoryCacheProviderBridge.start(RegionFactoryCacheProviderBridge.java:72)
at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:238)
at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1872)
at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:850)
at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:56)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:48)
at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:32)
我刚刚使用休眠 xml 文件配置了我的 CacheManager,但我不知道如何管理该错误。我在某处读到我必须使用 RegionFactory 但在 ehcache 文档中这不是最佳实践。我怎样才能以正确的方式解决我的问题?