【问题标题】:JBoss EAP 7 and IfinispanJBoss EAP 7 和 Ifinispan
【发布时间】:2017-12-14 13:16:42
【问题描述】:

我有一个用 JEE 编写的 Web 应用程序。我使用 hibernate 作为 JPA 提供程序,我想使用 Infinispan 作为二级缓存。当我浏览互联网时,我注意到只需要添加几行。我在我的 persistence.xml 中添加了这些行

<property name="hibernate.cache.provider_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="javax.persistence.sharedCache.mode" value="ENABLE_SELECTIVE"/>
<property name="hibernate.cache.use_second_level_cache" value="true"/>
<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory"/>
<property name="hibernate.cache.use_query_cache" value="true"/>

但是在 JBoss 上部署 ear 和 war 文件时,我收到一条错误消息

Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.engine.spi.CacheImplementor]
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:244)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.initializeService(AbstractServiceRegistryImpl.java:208)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.getService(AbstractServiceRegistryImpl.java:189)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:242)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
        ... 83 more
Caused by: org.hibernate.cache.CacheException: Unable to start region factory
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.start(InfinispanRegionFactory.java:415)
        at org.hibernate.internal.CacheImpl.<init>(CacheImpl.java:49)
        at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:28)
        at org.hibernate.engine.spi.CacheInitiator.initiateService(CacheInitiator.java:20)
        at org.hibernate.service.internal.SessionFactoryServiceRegistryImpl.initiateService(SessionFactoryServiceRegistryImpl.java:46)
        at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
        ... 88 more
Caused by: org.infinispan.jmx.JmxDomainConflictException: ISPN000034: There's already a JMX MBean instance type=CacheManager,name="SampleCacheManager" already registered under 'org.infinispan' JMX domain. If you want to allow multiple instances configured with same JMX domain enable 'allowDuplicateDomains' attribute in 'globalJmxStatistics' config element
        at org.infinispan.jmx.JmxUtil.buildJmxDomain(JmxUtil.java:52)
        at org.infinispan.jmx.CacheManagerJmxRegistration.updateDomain(CacheManagerJmxRegistration.java:79)
        at org.infinispan.jmx.CacheManagerJmxRegistration.buildRegistrar(CacheManagerJmxRegistration.java:73)
        at org.infinispan.jmx.AbstractJmxRegistration.registerMBeans(AbstractJmxRegistration.java:37)
        at org.infinispan.jmx.CacheManagerJmxRegistration.start(CacheManagerJmxRegistration.java:41)
        at org.infinispan.manager.DefaultCacheManager.start(DefaultCacheManager.java:639)
        at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:300)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.createCacheManager(InfinispanRegionFactory.java:532)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory$1.doWork(InfinispanRegionFactory.java:500)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory$1.doWork(InfinispanRegionFactory.java:473)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.workWithClassLoader(ClassLoaderServiceImpl.java:342)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.createCacheManager(InfinispanRegionFactory.java:472)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.start(InfinispanRegionFactory.java:380)
        ... 93 more

更新
当我的持久化单元看起来像这样时

<?xml version="1.0" encoding="UTF-8"?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0"
             xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
             http://java.sun.com/xml/ns/persistence/persistence_2_0.xsd">

    <persistence-unit name="myPersistenceUnit" transaction-type="RESOURCE_LOCAL">
    <non-jta-data-source>java:jboss/datasources/myDatasource</non-jta-data-source>
    <mapping-file>META-INF/orm_mapping.xml</mapping-file>
    <exclude-unlisted-classes>true</exclude-unlisted-classes>
        <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
         ...
        <properties>
          ...
            <property name="hibernate.cache.use_second_level_cache" value="true" />
          ...
        </properties>

    </persistence-unit>

</persistence>  

我遇到了异常

Caused by: 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.
        at org.hibernate.cache.internal.NoCachingRegionFactory.buildEntityRegion(NoCachingRegionFactory.java:66)
        at org.hibernate.internal.SessionFactoryImpl.determineEntityRegionAccessStrategy(SessionFactoryImpl.java:619)
        at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:332)
        at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:444)
        at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:879)
        ... 83 more

在persistence.xml中加入下面一行

<property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.infinispan.InfinispanRegionFactory" />

我仍然遇到 JMX MBean 异常

Caused by: org.infinispan.jmx.JmxDomainConflictException: ISPN000034: There's already a JMX MBean instance type=CacheManager,name="SampleCacheManager" already registered under 'org.infinispan' JMX domain. If you want to allow multiple instances configured with same JMX domain enable 'allowDuplicateDomains' attribute in 'globalJmxStatistics' config element
        at org.infinispan.jmx.JmxUtil.buildJmxDomain(JmxUtil.java:52)
        at org.infinispan.jmx.CacheManagerJmxRegistration.updateDomain(CacheManagerJmxRegistration.java:79)
        at org.infinispan.jmx.CacheManagerJmxRegistration.buildRegistrar(CacheManagerJmxRegistration.java:73)
        at org.infinispan.jmx.AbstractJmxRegistration.registerMBeans(AbstractJmxRegistration.java:37)
        at org.infinispan.jmx.CacheManagerJmxRegistration.start(CacheManagerJmxRegistration.java:41)
        at org.infinispan.manager.DefaultCacheManager.start(DefaultCacheManager.java:639)
        at org.infinispan.manager.DefaultCacheManager.<init>(DefaultCacheManager.java:300)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.createCacheManager(InfinispanRegionFactory.java:532)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory$1.doWork(InfinispanRegionFactory.java:500)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory$1.doWork(InfinispanRegionFactory.java:473)
        at org.hibernate.boot.registry.classloading.internal.ClassLoaderServiceImpl.workWithClassLoader(ClassLoaderServiceImpl.java:342)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.createCacheManager(InfinispanRegionFactory.java:472)
        at org.hibernate.cache.infinispan.InfinispanRegionFactory.start(InfinispanRegionFactory.java:380)
        ... 93 more

也许我需要某种 infinispan 配置文件来放置

<jmx duplicate-domains="true" />

就像这里提到的Infinispan as second level cache hibernate

【问题讨论】:

    标签: java hibernate jboss infinispan jboss-eap-7


    【解决方案1】:

    您应该查看 EAP 7 文档,因为获取二级缓存所需的所有配置(由 Infinispan 在后台提供支持)是这样的:

    <persistence-unit name="...">
      (...) <!-- other configuration -->
      <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>
      <properties>
        <property name="hibernate.cache.use_second_level_cache" value="true" />
        <property name="hibernate.cache.use_query_cache" value="true" />
      </properties>
    </persistence-unit>
    

    https://access.redhat.com/documentation/en-us/red_hat_jboss_enterprise_application_platform/7.1/html/development_guide/java_persistence_api_jpa#second_level_caches

    【讨论】:

    • 感谢您的回答。但是当我尝试将&lt;shared-cache-mode&gt; 添加到我的persistence.xml 时,它说这里不允许元素共享缓存模式。我的休眠版本可能有问题吗?还是缺少图书馆?
    • 起来!如文档中所示,它有几个可能的值。通常这是ENABLE_SELECTIVE #readthedocs ;)
    【解决方案2】:

    休眠版本应该是5.0.x。

    persistence.xml:

    <persistence ...>
            <persistence-unit ...>
                    ...
                    <shared-cache-mode>ENABLE_SELECTIVE</shared-cache-mode>  <!-- ADD THIS -->
                    <properties>
                            ...
                            <property name="hibernate.cache.use_second_level_cache" value="true" />  <!-- KEEP THIS -->
                    </properties>
            </persistence-unit>
    </persistence>
    

    删除所有其他 hibernate.cache.* 属性----只留下上面的

    请注意,使用上述设置,您必须将实体显式标记为@Cacheable。如果不希望将每个实体显式标记为@cacheable----,则可以将其用于共享缓存模式的ALL设置,然后所有实体都将被缓存。

    有关配置和实现的其他文档可以在 EAP 7:Hibernate 5 用户指南(http://docs.jboss.org/hibernate/orm/5.0/userguide/html_single/Hibernate_User_Guide.html#caching) 和 Hibernate 5 开发者指南(http://docs.jboss.org/hibernate/orm/5.0/devguide/en-US/html_single/#d5e1433) 和 Infinispan 8 用户指南(http://infinispan.org/docs/8.1.x/user_guide/user_guide.html)

    【讨论】:

    • 感谢您的回答。如果您能看到我的更新,我仍然会收到连接到 JMX MBean 的异常
    • @bartekms274:当使用库模式和全局配置生成器创建新的缓存管理器时,请在 globalJmxStatistics 配置中启用 allowDuplicateDomains 属性以解决此异常...确保 CachManager 已停止,在取消部署阶段
    • 感谢您的帮助。我终于设法使用库模式使用 infinispan 运行我的应用程序。 W还想问一件事。我想将它与 Hibernate 一起使用,所以我需要用“@Cache”注释每个实体。我是否需要在 infinispan.xml 配置文件中为每个实体指定本地缓存,就像在 infinispan 文档中显示的那样? Infinispan docs
    • JPA 缓存存储与 Hibernate 使用 Infinispan 作为二级缓存无关。
    • 顺便说一句,JMX 域重复异常在最新的 Infinispan 9.2.x 预发布版本中消失了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多