Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/actionscript-3/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate二级缓存和Hudson_Java_Hibernate_Hudson_Ehcache_Second Level Cache - Fatal编程技术网

Java Hibernate二级缓存和Hudson

Java Hibernate二级缓存和Hudson,java,hibernate,hudson,ehcache,second-level-cache,Java,Hibernate,Hudson,Ehcache,Second Level Cache,我正在使用hibernate的SecondLevelCache。这是我的xml配置文件: <persistence-unit name="EntityTestHibernate" transaction-type="RESOURCE_LOCAL"> <properties> <property name="hibernate.show_sql" value="false"/> <pr

我正在使用hibernate的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" />
当我在本地运行UnitTest时,我没有问题。所有测试都通过了,但如果我在Hudson continuos Integration上运行测试,我会出现以下错误(如果我在@DirtiesContext上设置或不设置注释,问题是相同的):

我怎样才能解决这个问题? 为什么只有哈德逊才会发生这种情况


更新 根据@lanimall的建议,我有:

  • 禁用Hudson上的所有节点
  • 修改了persistence.xml
替换

< property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />


但这并不能解决我的问题(但这是一个很好的开端:-)…错误是一样的)


我的环境配置是hibernate3和ehcache-2.7.2

您使用的是什么版本的hibernate?还有Ehcache? 我认为可能发生的情况是,hudson正在某个应用服务器上运行(如Glassfish、Tomcat 5、JBoss、Jetty 6等),并且它可能有一些ehcache或hibernate lib版本,这些版本与您在应用程序中嵌入的版本相竞争……因此,只有在hudson中运行测试时才会出现问题。一定要调查一下

另外,根据ehcache/hibernate文档(),请尝试使用“hibernate.cache.region.factory_类”设置,而不是“hibernate.cache.provider_类”

我也通常使用单例工厂(否则您的JUNIT测试将无法工作…)。基于hibernate版本,使用 hibernate.cache.region.factory\u class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

或(对于hibernate 4.x及更高版本)

hibernate.cache.region.factory\u class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory


希望对…有所帮助。

我找到了解决办法

在persistence.xml中,我将2个持久化单元配置为单例,在一些测试中,两者都使用。那样的话,这些人都是单身

然后,当与其中一个实体关联的EntityFactory关闭时,另一个实体使用的ehcache关闭(因为这两个实体管理器之间共享了一个Singleton实例)


非常感谢@lanimall让我敞开心扉

JUnit共享Spring上下文以提高速度。当在我的一个测试中删除显式关闭Spring上下文时,我避免了此异常。

正如您所建议的,我已经:禁用Hudson上的所有节点;修改persistence.xml,将
替换为
;但这并不能解决我的问题(但这是一个很好的开端:-)…错误是一样的)。我的环境配置是hibernate3和ehcache-2.7.2 Interesting…您正在哪个应用程序服务器上运行hudson?看起来hudson中有什么东西(错误地)关闭了cachemanager…现在我在考虑更多,hudson测试的singleton工厂可能不适合使用…因为hudson可能会在每个测试结束时关闭缓存管理器…如果您使用singleton,那么这意味着实例将在此后保持关闭状态?我会尝试非单例工厂:net.sf.ehcache.hibernate.EhCacheRegionFactory.AppServer是Tomcat 6。我也认为Hudson每次测试都会关闭缓存,但这种行为在本地应该是相同的。显然,对于这个其他配置(EHCacheRegioFactory),问题是:
同一个VM中已经存在另一个具有相同名称“cacheTest”的CacheManager。请在配置中为每个CacheManager提供唯一的名称,或执行以下操作之一:[junit]1。使用CacheManager.create()静态工厂方法之一重用具有相同名称的相同CacheManager,或者在必要时创建一个[junit]2。在创建具有相同名称的新cacheManager之前,请关闭以前的cacheManager。
@Cache(region="entityCache", usage=CacheConcurrencyStrategy.READ_WRITE )
>     javax.persistence.PersistenceException: org.hibernate.cache.CacheException: java.lang.IllegalStateException:
> The cacheTest Cache is not alive (STATUS_SHUTDOWN)    at
> org.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1167)
>   at
> org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:673)
>   at
> org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:641)
> Caused by: org.hibernate.cache.CacheException:
> java.lang.IllegalStateException: The cacheTest Cache is not alive
> (STATUS_SHUTDOWN)     at
> net.sf.ehcache.hibernate.regions.EhcacheTransactionalDataRegion.remove(EhcacheTransactionalDataRegion.java:164)
>   at
> net.sf.ehcache.hibernate.strategy.AbstractEhcacheAccessStrategy.evict(AbstractEhcacheAccessStrategy.java:119)
>   at
> net.sf.ehcache.hibernate.nonstop.NonstopAwareEntityRegionAccessStrategy.evict(NonstopAwareEntityRegionAccessStrategy.java:96)
>   at
> org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:144)
>   at
> org.hibernate.event.def.DefaultRefreshEventListener.onRefresh(DefaultRefreshEventListener.java:62)
>   at org.hibernate.impl.SessionImpl.fireRefresh(SessionImpl.java:1118)
>   at org.hibernate.impl.SessionImpl.refresh(SessionImpl.java:1098)    at
> org.hibernate.ejb.AbstractEntityManagerImpl.refresh(AbstractEntityManagerImpl.java:666)
> Caused by: java.lang.IllegalStateException: The cacheTest Cache is
> not alive (STATUS_SHUTDOWN)   at
> net.sf.ehcache.Cache$CacheStatus.checkAlive(Cache.java:3946)  at
> net.sf.ehcache.Cache.checkStatus(Cache.java:2664)     at
> net.sf.ehcache.Cache.removeInternal(Cache.java:2288)  at
> net.sf.ehcache.Cache.remove(Cache.java:2207)  at
> net.sf.ehcache.Cache.remove(Cache.java:2125)  at
> net.sf.ehcache.hibernate.regions.EhcacheTransactionalDataRegion.remove(EhcacheTransactionalDataRegion.java:160)
< property name="hibernate.cache.provider_class" value="net.sf.ehcache.hibernate.EhCacheProvider" />
<property name="hibernate.cache.region.factory_class" value="net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory" />