我正在尝试将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文档中,这不是最佳实践。我如何以正确的方式解决我的问题?
最佳答案
不知道在哪里看到使用RegionFactory不是最佳实践...请查阅http://ehcache.org/documentation/user-guide/hibernate#Configure-Ehcache-as-the-Second-Level-Cache-Provider...and处的ehcache文档,这正是他们所说的。
另外,您应该使用SingletonEhCacheRegionFactory来解决您的junit问题(单例意味着将只有1个缓存管理器...因此,没有2个具有与您的异常中所示的相同缓存名称的cachemanager)
net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
请注意:对于Hibernate 4,请使用org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory而不是net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory
希望能有所帮助。