2017-08-16 106 views
1

我有一個部分與org.infinispan.jmx.JmxDomainConflictException: Domain already registered org.infinispan Exception?有關的問題,區別在於我在JBoss 7.1.1中使用了hibernate 4.3.6。我有兩個應用程序,已大致的persistence.xml看起來就像是:發生org.infinispan.jmx.JmxDomainConflictException:在JBoss上已經使用hibernate-infinispan註冊的域

<persistence> 
    <persistence-unit name="..." transaction-type="JTA"> 
     <provider>org.hibernate.jpa.HibernatePersistenceProvider</provider> 
     <jta-data-source>osgi:service/javax.sql.DataSource/(osgi.jndi.service.name=...)</jta-data-source> 
     <class>...</class> 
     <shared-cache-mode>ALL</shared-cache-mode> 
     <properties> 
      <property name="hibernate.cache.use_query_cache" 
       value="true" /> 
      <property name="hibernate.cache.use_second_level_cache" 
       value="true" /> 
      <property name="hibernate.cache.infinispan.container" 
       value="hibernate-exp" /> 
      <property name="hibernate.cache.region.factory_class" 
       value="org.hibernate.cache.infinispan.InfinispanRegionFactory" /> 
     </properties> 
    </persistence-unit> 
</persistence> 

例外,當第二個應用程序的持續性單元得到由休眠加載。現在從網上解決方案經常提到增加這Infinispan的-配置:

<globalJmxStatistics allowDuplicateDomains="true" /> 

不過這個配置文件是休眠-的Infinispan模塊的一部分,所以我不能簡單地修改它。這issue seems to be fixed,但我不幸的是限制使用infinispan 6.任何建議?

編輯:我期望使用JBoss AS緩存管理器。這就是爲什麼hibernate.cache.infinispan.container設置和hibernate-ext配置這樣的domain.xml

<domain xmlns="urn:jboss:domain:1.2"> 
    <profiles> 
     <profile name="full"> 
      <subsystem xmlns="urn:jboss:domain:infinispan:1.2" default-cache-container="hibernate"> 
       <cache-container name="hibernate-exp" default-cache="local-query"> 
        <local-cache name="entity"> 
         <transaction mode="NONE"/> 
         <eviction strategy="@[email protected]" max-entries="@[email protected]"/> 
         <expiration max-idle="@[email protected]" interval="@[email protected]"/> 
         <locking concurrency-level="@[email protected]"/> 
        </local-cache> 
        <local-cache name="local-query"> 
         <transaction mode="NONE"/> 
         <eviction strategy="@[email protected]" max-entries="@[email protected]"/> 
         <expiration max-idle="@[email protected]" interval="@[email protected]"/> 
         <locking concurrency-level="@[email protected]"/> 
        </local-cache> 
        <local-cache name="timestamps"> 
         <transaction mode="NONE"/> 
         <eviction strategy="NONE"/> 
        </local-cache> 
       </cache-container> 
      </subsystem> 
     </profile> 
    </profiles> 
</domain> 

然而hibernate.cache.infinispan.container遺漏發生異常:

org.hibernate.cache.NoCacheRegionFactoryAvailableException: Second-level cache is used in the application, but property hibernate.cache.region.factory_class is not given; please either disable second level cache or set correct region factory using the hibernate.cache.region.factory_class setting and make sure the second level cache provider (hibernate-infinispan, e.g.) is available on the classpath. 

我不知道爲什麼會出現這種錯誤,因爲hibernate-infinispan,infinispan-commons和infinispan-core位於hibernate的類路徑中。我不知道,但是這可能以某種方式相關的事實,我部署兩個不同的休眠版本的JBoss成(4.0.1和4.3.6)。沒有該屬性的配置適用於4.0.1,但不適用於4.3.6。

如果我使用org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory我得到

java.lang.ClassCastException: org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory cannot be cast to org.hibernate.cache.spi.RegionFactory 
     at org.hibernate.cfg.SettingsFactory.createRegionFactory(SettingsFactory.java:478) 

...因爲org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory從JBoss的-AS-JPA-hibernate4是由Hibernate 4.0.1連接到RegionFactory。所使用的SettingsFactory是由Hibernate 4.3.6,並嘗試將其從自己的模塊轉換爲RegionFactory

EDIT2:隨着調試器的幫助下,我發現,如果我使用Hibernate 4.0.1,屬性hibernate.cache.region.factory_class設置爲org.jboss.as.jpa.hibernate4.infinispan.SharedInfinispanRegionFactory雖然我沒有在我的persistence.xml該屬性設置。這些屬性在映射舉行,例如,如果調試器org.hibernate.cfg.AnnotationBinder.bindClass(XClass, Map<XClass, InheritanceState>, Mappings)暫停。

這個屬性獲取的JBoss在HibernatePersistenceProviderAdaptor.addProviderDependencies(...)還設置:

public class HibernatePersistenceProviderAdaptor implements PersistenceProviderAdaptor { 
    private static final String DEFAULT_REGION_FACTORY = SharedInfinispanRegionFactory.class.getName(); 
    //... 
    public void addProviderDependencies(ServiceRegistry registry, ServiceTarget target, ServiceBuilder<?> builder, PersistenceUnitMetadata pu) { 
     Properties properties = pu.getProperties(); 
     if (Boolean.parseBoolean(properties.getProperty(AvailableSettings.USE_SECOND_LEVEL_CACHE))) { 
      //... 
      String regionFactory = properties.getProperty(AvailableSettings.CACHE_REGION_FACTORY); 
      if (regionFactory == null) { 
       regionFactory = DEFAULT_REGION_FACTORY; 
       properties.setProperty(AvailableSettings.CACHE_REGION_FACTORY, regionFactory); 
      } 
      //... 
} 

SharedInfinispanRegionFactory是一個,它使用從domain.xml緩存設置,所以如果我會用org.hibernate.cache.infinispan.InfinispanRegionFactory這些設置將不適用。但因爲我不能用SharedInfinispanRegionFactory由於ClassCastException我可能需要實現自己的RegionFactory

回答

3

您可以通過設置屬性hibernate.cache.infinispan.cfg更改配置文件,但我不認爲這是正確的解決方案,因爲這意味着你創建的Infinispan 緩存管理器的新實例。

當你在JBoss AS中使用2LC,你應該抓住一個由AS管理的緩存管理器,能夠設置在standalone.xml等配置,因此無論是不是在所有或設置設置hibernate.cache.region.factory_class屬性,到org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory(遺憾的是我不確定這是如何集成在這樣一箇舊版本)。

+0

這是有道理的,但請看我編輯的問題。 –

0

不幸的是,爲CDI提供的修復(ISPN-2886)可能不會對您有所幫助。 JBoss AS配置很可能需要一些Infinispan緩存來進行會話複製,然後您請求額外的緩存來進行JPA二級緩存。這兩個創建單獨的緩存管理器並導致衝突。

根據JBoss AS 7 manual,在使用Hibernate 4和Infinispan時(兩者均默認發貨),您不需要指定任何其他屬性。

請問您是否可以嘗試移除所有這些附加屬性?

相關問題