gpt4 book ai didi

java - Hibernate 二级缓存和 Hudson

转载 作者:行者123 更新时间:2023-12-04 04:45:14 26 4
gpt4 key购买 nike

我在 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" />






我的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 时,我没有问题。所有测试都通过了,但是如果我在 Hudson continuos integretion 上运行测试,我会出现以下错误(如果我在 @DirtiesContext 上设置或不设置注释,问题是一样的):
>     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)

我怎么能解决这个问题?
为什么这只发生在 hudson 身上?

更新

正如@lanimall 所建议的,我有:
  • 禁用 Hudson 上的所有节点;
  • 修改了persistence.xml。

  • 更换
    < 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" />

    但这并不能解决我的问题(但这是一个好的开始:-)...错误是一样的)。

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

    最佳答案

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

    此外,根据 ehcache/hibernate 文档( http://ehcache.org/documentation/user-guide/hibernate#Configure-Ehcache-as-the-Second-Level-Cache-Provider ),请尝试使用“hibernate.cache.region.factory_class”设置而不是“hibernate.cache.provider_class”...

    而且我通常也使用单例工厂(否则你的 JUNIT 测试将无法工作......)。基于 hibernate 版本,使用
    hibernate.cache.region.factory_class=net.sf.ehcache.hibernate.SingletonEhCacheRegionFactory

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

    hibernate.cache.region.factory_class=org.hibernate.cache.ehcache.SingletonEhCacheRegionFactory

    希望有帮助...

    关于java - Hibernate 二级缓存和 Hudson,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18297688/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com