Добавление hibernate-ehcache.jar и ehcache-core.jar в WildFly в качестве модуля

Настройка провайдера кеша в persistence.xml наряду с некоторыми другими связанными свойствами следующим образом.

<shared-cache-mode>ALL</shared-cache-mode>

<properties>
    <property name="hibernate.dialect" value="org.hibernate.dialect.MySQL5Dialect"/>
    <property name="hibernate.show_sql" value="true" />
    <property name="hibernate.format_sql" value="true" />
    <property name="hibernate.event.merge.entity_copy_observer" value="allow"/>
    <property name="hibernate.use_sql_comments" value="true" />

    <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/>
    <property name="hibernate.cache.use_second_level_cache" value="true"/>
    <property name="hibernate.cache.use_query_cache" value="true"/>
    <property name="hibernate.cache.use_structured_entries" value="true"/>
    <property name="hibernate.cache.generate_statistics" value="true"/>
    <property name="hibernate.cache.infinispan.statistics" value="true" />
    <property name="hibernate.ejb.naming_strategy" value="org.hibernate.cfg.ImprovedNamingStrategy"/>
</properties>

Это работает, когда следующие два JAR-файла добавляются в путь к классам времени компиляции самого модуля EE.

  • Зимуют-EHCache-5.0.6.Final.jar
  • EHCache-ядро-2.4.3.jar

Разрешено ли добавлять эти файлы JAR на сам сервер как модуль, поскольку эти файлы JAR не обязательно должны присутствовать в пути к классам во время компиляции?

Я получаю исключение, когда модуль, подобный следующему, пытается ${Home}/modules/system/layers/base/net/sf/ehcache/main/module.xml,

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="net.sf.ehcache">
    <resources>
        <resource-root path="hibernate-ehcache-5.0.6.Final.jar"/>
        <resource-root path="ehcache-core-2.4.3.jar"/>
    </resources>

    <dependencies>
        <module name="org.hibernate"/>
        <module name="org.slf4j"/>
    </dependencies>
</module>

Это вызывает следующее исключение, как если бы оно не имело никакого эффекта вообще.

15:53:32,671 ERROR [org.jboss.msc.service.fail] (ServerService Thread Pool -- 17) MSC000001: Failed to start service jboss.persistenceunit."WildFly.ear/WildFly-ejb.jar#org.hibernate.project.unit".__FIRST_PHASE__: org.jboss.msc.service.StartException in service jboss.persistenceunit."WildFly.ear/WildFly-ejb.jar#org.hibernate.project.unit".__FIRST_PHASE__: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.cache.spi.RegionFactory]
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl$1$1.run(PhaseOnePersistenceUnitServiceImpl.java:121)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl$1$1.run(PhaseOnePersistenceUnitServiceImpl.java:103)
    at org.wildfly.security.manager.WildFlySecurityManager.doChecked(WildFlySecurityManager.java:665)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl$1.run(PhaseOnePersistenceUnitServiceImpl.java:130)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
Caused by: org.hibernate.service.spi.ServiceException: Unable to create requested service [org.hibernate.cache.spi.RegionFactory]
    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.boot.internal.MetadataBuilderImpl$MetadataBuildingOptionsImpl.<init>(MetadataBuilderImpl.java:663)
    at org.hibernate.boot.internal.MetadataBuilderImpl.<init>(MetadataBuilderImpl.java:127)
    at org.hibernate.boot.MetadataSources.getMetadataBuilder(MetadataSources.java:135)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:185)
    at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.<init>(EntityManagerFactoryBuilderImpl.java:149)
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:28)
    at org.hibernate.jpa.boot.spi.Bootstrap.getEntityManagerFactoryBuilder(Bootstrap.java:40)
    at org.jboss.as.jpa.hibernate5.TwoPhaseBootstrapImpl.<init>(TwoPhaseBootstrapImpl.java:39)
    at org.jboss.as.jpa.hibernate5.HibernatePersistenceProviderAdaptor.getBootstrap(HibernatePersistenceProviderAdaptor.java:159)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl.createContainerEntityManagerFactoryBuilder(PhaseOnePersistenceUnitServiceImpl.java:243)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl.access$800(PhaseOnePersistenceUnitServiceImpl.java:60)
    at org.jboss.as.jpa.service.PhaseOnePersistenceUnitServiceImpl$1$1.run(PhaseOnePersistenceUnitServiceImpl.java:118)
    ... 7 more
Caused by: org.hibernate.HibernateException: could not instantiate RegionFactory [org.hibernate.cache.ehcache.EhCacheRegionFactory]
    at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:84)
    at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:29)
    at org.hibernate.boot.registry.internal.StandardServiceRegistryImpl.initiateService(StandardServiceRegistryImpl.java:88)
    at org.hibernate.service.internal.AbstractServiceRegistryImpl.createService(AbstractServiceRegistryImpl.java:234)
    ... 21 more
Caused by: org.hibernate.boot.registry.selector.spi.StrategySelectionException: Unable to resolve name [org.hibernate.cache.ehcache.EhCacheRegionFactory] as strategy [org.hibernate.cache.spi.RegionFactory]
    at org.hibernate.boot.registry.selector.internal.StrategySelectorImpl.selectStrategyImplementor(StrategySelectorImpl.java:113)
    at org.hibernate.cache.internal.RegionFactoryInitiator.initiateService(RegionFactoryInitiator.java:71)
    ... 24 more

Разрешено ли добавлять эти два файла JAR на сервер в виде модуля или существует другой способ достижения этого?


Модуль org.hibernate содержит следующие ресурсы вместе с их зависимостями.

<?xml version="1.0" encoding="UTF-8"?>
<module xmlns="urn:jboss:module:1.3" name="org.hibernate">
    <resources>
        <resource-root path="hibernate-core-5.0.6.Final.jar"/>
        <resource-root path="hibernate-envers-5.0.6.Final.jar"/>
        <resource-root path="hibernate-entitymanager-5.0.6.Final.jar"/>
    </resources>

    <dependencies>
        <module name="asm.asm"/>
        <module name="com.fasterxml.classmate"/>
        <module name="javax.api"/>
        <module name="javax.annotation.api"/>
        <module name="javax.enterprise.api"/>
        <module name="javax.persistence.api"/>
        <module name="javax.transaction.api"/>
        <module name="javax.validation.api"/>
        <module name="javax.xml.bind.api"/>
        <module name="org.antlr"/>
        <module name="org.apache.commons.collections"/>
        <module name="org.dom4j"/>
        <module name="org.javassist"/>
        <module name="org.jboss.as.jpa.spi"/>
        <module name="org.jboss.jandex"/>
        <module name="org.jboss.logging"/>
        <module name="org.jboss.vfs"/>
        <module name="org.hibernate.commons-annotations"/>
        <module name="org.hibernate.infinispan" services="import" optional="true"/>
        <module name="org.hibernate.jipijapa-hibernate4-3" services="import"/>
    </dependencies>
</module>

Я использую Hibernate 5.0.6 final в WildFly 9.0.2 final.

2 ответа

Я думаю, что вы должны сделать эти шаги:

  1. Добавьте hibernate-ehcache.jar в основной модуль hibernate;

  2. Добавьте ehcache как модуль wildfly. Вы должны создать папку: [wildfly]/modules/system/ слои / base / net / sf / ehcache / main с ehcache jar и module.xml.

  3. Сделайте ссылку на модуль ehcache в основном файле hibernate module.xml.

С уважением

Стив

В Wildfly (например, версия 10) вы можете использовать Infinispan (совместимый с JSR107), чтобы вместо этого сделать кэш L2. В каталоге модулей wildfly - org/hibernate/main/module.xml, вы должны использовать их так (не нужно указывать "hibernate-ehcache-5.0.11.Final.jar"):

 <resource-root path="hibernate-core-5.0.11.Final.jar"/>
 <resource-root path="hibernate-envers-5.0.11.Final.jar"/>
 <resource-root path="hibernate-entitymanager-5.0.11.Final.jar"/>
 <resource-root path="hibernate-java8-5.0.11.Final.jar"/>

Сервер WildFly загружается по умолчанию с Infinispan.

В вашем файле persistance.xml конфигурация будет такой:

 <!-- enable query cache -->
  <property name="hibernate.cache.use_query_cache" value="true"/>
  <!-- EhCache provider-->
  <!-- <property name="hibernate.cache.region.factory_class" value="org.hibernate.cache.ehcache.EhCacheRegionFactory"/> -->
  <!-- 2nd level cache -->
  <property name="hibernate.cache.use_second_level_cache" value="true"/>
  <!-- enable statistics -->
  <property name="hibernate.generate_statistics" value="false"/>
  <!-- for Wildfly only -->
  <property name="wildfly.jpa.hibernate.search.module" value="org.hibernate.search.orm:5.5.5.Final"/>
Другие вопросы по тегам