2017-08-16 104 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时(两者均默认发货),您不需要指定任何其他属性。

请问您是否可以尝试移除所有这些附加属性?

相关问题