有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

javahibernate二级缓存&JUnit

我正在尝试将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)

我刚刚用HibernateXML文件配置了CacheManager,我不知道如何管理这个错误。我在某个地方读到,我必须使用RegionFactory,但在ehcache文档中,这不是最佳实践。我怎样才能以正确的方式解决我的问题


共 (1) 个答案

  1. # 1 楼答案

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

    此外,您应该使用SingleToneCacheRegionFactory,它应该修复junit问题(singleton意味着只有一个缓存管理器……因此没有两个缓存管理器具有与异常中所示相同的缓存名称)

    网旧金山。ehcache。冬眠单音缓存区域工厂

    请注意:对于Hibernate 4,使用org。冬眠隐藏物ehcache。SingleToneCacheRegionFactory而不是net。旧金山。ehcache。冬眠单音缓存区域工厂

    希望有帮助