当前位置: 首页 > 知识库问答 >
问题:

org.infinispan.jmx。JmxDomainConflictException:域已在JBoss上向hibernate infinispan注册

卫俊力
2023-03-14

我有一个部分与org.infinispan.jmx有关的问题。JmxDomainConflictException:域已注册org.infinispan异常?不同的是,我在JBoss 7.1.1中使用hibernate 4.3.6。我有两个应用程序,它们具有持久性。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配置中:

<globalJmxStatistics allowDuplicateDomains="true" />

然而,这个配置文件是hibernate infinispan模块的一部分,所以我不能简单地修改它。这个问题似乎已经解决,但不幸的是我只能使用infinispan 6。有什么建议吗?

编辑:我希望使用JBoss作为缓存管理器。这就是为什么hibernate.cache.infinispan。容器已设置,并且在域中按如下方式配置Hibernateext

<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。容器发生异常:

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)中部署了两个不同的hibernate版本有关。不带属性的配置适用于4.0.1,但不适用于4.3.6。

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

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。jboss-as-jpa-hibernate4中的InfinispanRegionFactory连接到Hibernate 4.0.1中的RegionFactory。使用的设置工厂来自Hibernate 4.3.6,它试图从自己的模块将其强制转换到RegionFactory。

编辑2:在调试器的帮助下,我发现,如果我使用Hibernate 4.0.1,属性hibernate.cache.region.factory_class设置为org.jboss.as.jpa.hibernate4.infinispan.SharedInfinispanRealonFactory,尽管我没有在我的persistence.xml.中设置该属性这些属性保存在映射中,例如,如果调试器在org.hibernate.cfg.AnnotationBinder.bind类(XClass, Map

该属性由JBoss在HibernatePeristenceProviderAdaptor.add提供者依赖项(...)中额外设置:

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);
            }
            //...
 }

类SharedFinishanRegionFactory就是这样一个,它使用域中的缓存设置。如果我使用org.hibernate.cache.infinispan。InfinispanRegionFactory这些设置不适用。但是,由于类castexception,我无法使用SharedInfinispanRegionFactory,因此我可能需要实现自己的区域工厂(RegionFactory)。

共有2个答案

易超
2023-03-14

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

根据JBoss AS 7手册,使用Hibernate 4和Infinispan时不需要指定任何其他属性(默认情况下都提供)。

请您尝试删除所有这些附加属性好吗?

颜君浩
2023-03-14

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

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

 类似资料:
  • 我正在尝试将Javers与SpringDataREST项目集成。目前,我的域中有以下实体。 Student.class 联系电话。班 在javers的文件中提到: 在现实世界中,域对象通常包含各种您不想审计的嘈杂属性,例如动态代理(如Hibernate懒惰加载代理)、重复数据、技术标志、自动生成数据等。 那么,这是否意味着我在contact number类中的学生字段或学生类中的联系人字段中添加了

  • 我在AWS/S3上与其他域名注册商建立了许多静态站点;然而,谷歌域名给了我一些问题。我采取的步骤: 在S3/AWS上: > 已创建桶domainname.org 通过添加index.html启用静态网站托管 已将index.html和相关文档上载到存储桶 创建bucket www.domainname.org以重定向到bucket domainname.org创建domainname.org的bu

  • jboss日志:- JBAS015876:开始部署“medmark.war”17:33:56948 INFO[org.jboss.as.ejb3.deployment.processors.ejbndibingsdeploymentunitprocessor](MSC服务线程1-8)部署单元部署“medmark.war”中名为HelloService的会话bean的JNDI绑定如下: EJB类:

  • 注册域名 目前,web3j仅支持ENS域的解析。它不支持注册。有关如何做到这一点的说明,请参阅ENS quickstart。

  • 问题内容: 我在JBoss eap 6.1服务器上运行Arquillian测试(由jenkins作业启动)时遇到问题。在JBoss 7.1.1服务器上运行测试没问题,但是当我切换到eap 6.1时,所有测试都收到以下异常: 如果我在本地计算机上的EAP 6.1服务器上运行测试,则一切工作正常(配置相同,因此不会出现问题)。 有谁知道可能是什么问题? Arquillian依赖项: managed 问

  • 我试图通过JNDI从Wildfly 10远程调用JBoss 7上的EJB3.1应用程序。 在Wildfly中部署的独立java客户机上执行代码运行良好,我收到一个ClassCastException: 以下是我正在使用的属性: 项目具有jboss as ejb客户端bom依赖项: 查找看起来很标准: 有什么想法吗?