org.infinispan.jmx.JmxDomainConflictException:域已经在JBoss上注册了hibernate-infinispan

时间:2017-08-16 14:49:57

标签: hibernate exception jboss infinispan

我有一个与org.infinispan.jmx.JmxDomainConflictException: Domain already registered org.infinispan Exception?部分相关的问题,区别在于我在JBoss 7.1.1中使用了hibernate 4.3.6。我有两个应用程序,其persistence.xml大致如下:

<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>

当第二个应用程序的持久性单元被hibernate加载时,会发生异常。现在网上的解决方案经常提到将其添加到infinispan-config:

<globalJmxStatistics allowDuplicateDomains="true" />

但是这个配置文件是hibernate-infinispan模块的一部分,所以我不能简单地修改它。这issue seems to be fixed,但我很遗憾地被限制使用infinispan 6.有什么建议吗?

编辑:我希望能够使用JBoss AS缓存管理器。这就是设置hibernate.cache.infinispan.container并在hibernate-extdomain.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="@hibernate.expireable.eviction.strategy@" max-entries="@hibernate.expireable.eviction.max_entries@"/> <expiration max-idle="@hibernate.expireable.expiration.max_idle@" interval="@hibernate.expireable.expiration.interval@"/> <locking concurrency-level="@hibernate.expireable.locking.concurrency_level@"/> </local-cache> <local-cache name="local-query"> <transaction mode="NONE"/> <eviction strategy="@hibernate.expireable.eviction.strategy@" max-entries="@hibernate.expireable.eviction.max_entries@"/> <expiration max-idle="@hibernate.expireable.expiration.max_idle@" interval="@hibernate.expireable.expiration.interval@"/> <locking concurrency-level="@hibernate.expireable.locking.concurrency_level@"/> </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. 会出现异常:

org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory

我不知道为什么会出现这种错误,因为hibernate-infinispan,infinispan-commons和infinispan-core都在hibernate的类路径上。我不确定,但这可能与某些事实有关,我将两个不同的hibernate版本部署到JBoss(4.0.1和4.3.6)。没有属性的配置适用于4.0.1,但不适用于4.3.6。

如果我使用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的RegionFactory从Hibernate 4.0.1连接到SettingsFactory。使用过的RegionFactory来自Hibernate 4.3.6,并尝试将其从自己的模块转换为hibernate.cache.region.factory_class

edit2:在调试器的帮助下我发现,如果我使用Hibernate 4.0.1,属性org.jboss.as.jpa.hibernate4.infinispan.SharedInfinispanRegionFactory设置为org.hibernate.cfg.AnnotationBinder.bindClass(XClass, Map<XClass, InheritanceState>, Mappings),尽管我没有在我的persistence.xml中设置该属性。例如,如果调试器在HibernatePersistenceProviderAdaptor.addProviderDependencies(...)中停止。

,这些属性将保留在映射中

JBoss在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,因此我可能需要实现自己的pointInterval

2 个答案:

答案 0 :(得分:4)

您可以通过设置属性hibernate.cache.infinispan.cfg来更改配置文件,但我认为这不是正确的解决方案,因为这意味着您创建了Infinispan 缓存管理器的新实例

当您在JBoss AS中使用2LC时,您应该获取由AS管理的缓存管理器,能够在standalone.xml等中设置配置,因此要么不设置hibernate.cache.region.factory_class属性或将org.jboss.as.jpa.hibernate4.infinispan.InfinispanRegionFactory设置为alter session set spatial_vector_acceleration=TRUE; (遗憾的是我不确定它是如何在这样的旧版本中集成的)。

答案 1 :(得分:0)

不幸的是,为CDI(ISPN-2886)提供的修复可能不会帮助您。 JBoss AS配置很可能需要一些Infinispan缓存来进行会话复制,然后您需要为JPA二级缓存请求额外的缓存。这两个创建单独的缓存管理器并导致冲突。

根据JBoss AS 7 manual,您在使用Hibernate 4和Infinispan时都不需要指定任何其他属性(两者都默认提供)。

您可以尝试删除所有这些附加属性吗?