Hibernate二级缓存& JUnit的

时间:2013-08-03 12:15:52

标签: java hibernate junit ehcache hibernate-cache

我正在尝试将SecondLevelCache与hibernate一起使用。这是我的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)

我刚刚使用hibernate xml文件配置了我的CacheManager,我不知道如何管理该错误。我在某处读过我必须使用RegionFactory,但在ehcache文档中,这不是最佳实践。我怎么能以正确的方式解决我的问题?

1 个答案:

答案 0 :(得分:1)

不确定在哪里看到使用RegionFactory不是最佳做法...查看http://ehcache.org/documentation/user-guide/hibernate#Configure-Ehcache-as-the-Second-Level-Cache-Provider...and的ehcache文档,这正是他们所说的你应该使用的。

此外,你应该使用SingletonEhCacheRegionFactory来解决你的junit问题(单例意味着只有1个缓存管理器...因此没有2个缓存管理器具有相同的cachename,如你的例外所示)

         net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

请注意:对于Hibernate 4,请使用org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory而不是net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

希望有所帮助。