2017-03-06 44 views
0

我想配置一个JDBC支持的Infinispan缓存作为我的Java EE应用程序使用Hibernate Search的后端。我正在部署在JBoss EAP 7.0或Wildfly 10上。我有一个模块,缓存容器和persistence.xml配置,在启动时不会给我任何错误。另外,我可以创建JPA对象,并按照预期通过Hibernate Search对其进行索引。然后我可以成功查询这些对象。但是,我从来没有将数据库中创建的SQL表配置为缓存容器的JDBC数据源。所以,显然,搜索索引只存在于内存中,并且不会在应用程序服务器重新启动时持久存在。以下是我迄今为止所做的:Infinispan/JDBC作为后端Hibernate搜索Wildfly/JBoss

  1. 下载了与嵌入到JBoss EAP中的Infinispan版本相对应的Infinispan 8.1.x版本。这样做是因为Infinispan的休眠搜索模块未包括嵌入式模块
  2. 在我的JBoss EAP内配置的Infinispan的休眠搜索模块相应的模块
  3. 修改了我的独立,全ha.xml JBoss的EAP配置文件包括JDBC支持的高速缓存容器和缓存定义
  4. 修改了我的persistence.xml文件,使使用Infinispan的高速缓存管理器和目录提供商

这里是我的cache定义在standalone-full-ha.xml中找到容器:

<cache-container name="hibernateSearch" default-cache="LuceneIndexesData" module="org.infinispan.cachestore.jdbc" jndi-name="java:jboss/infinispan/hibernateSearch"> 
      <transport lock-timeout="60000"/> 
      <replicated-cache name="LuceneIndexesMetadata" statistics-enabled="true" mode="SYNC"> 
       <binary-keyed-jdbc-store data-source="InfinispanCacheDS" passivation="false" purge="false" shared="true"> 
        <binary-keyed-table> 
         <id-column name="ID_COLUMN" type="VARCHAR(255)"/> 
         <data-column name="DATUM" type="BYTEA"/> 
        </binary-keyed-table> 
       </binary-keyed-jdbc-store> 
      </replicated-cache> 
      <replicated-cache name="LuceneIndexesData" statistics-enabled="true" mode="SYNC"> 
       <binary-keyed-jdbc-store data-source="InfinispanCacheDS" passivation="false" purge="false" shared="true"> 
        <binary-keyed-table> 
         <id-column name="ID_COLUMN" type="VARCHAR(255)"/> 
         <data-column name="DATUM" type="BYTEA"/> 
        </binary-keyed-table> 
       </binary-keyed-jdbc-store> 
      </replicated-cache> 
      <replicated-cache name="LuceneIndexesLocking" statistics-enabled="true" mode="SYNC"/> 
     </cache-container> 

这里是独立的,全ha.xml我的JDBC数据源:

<datasource jndi-name="java:jboss/datasources/InfinispanCacheDS" pool-name="InfinispanCacheDS" enabled="true" use-java-context="true" statistics-enabled="true"> 
       <connection-url>jdbc:postgresql://localhost:5432/db_infinispan_cache</connection-url> 
       <driver>postgresql-jdbc4</driver> 
       <pool> 
        <min-pool-size>10</min-pool-size> 
        <max-pool-size>20</max-pool-size> 
        <prefill>true</prefill> 
        <flush-strategy>IdleConnections</flush-strategy> 
       </pool> 
       <security> 
        <user-name>infinispan_cache</user-name> 
        <password>mypassword</password> 
       </security> 
       <validation> 
        <valid-connection-checker class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLValidConnectionChecker"/> 
        <validate-on-match>true</validate-on-match> 
        <exception-sorter class-name="org.jboss.jca.adapters.jdbc.extensions.postgres.PostgreSQLExceptionSorter"/> 
       </validation> 
       <statement> 
        <track-statements>true</track-statements> 
       </statement> 
      </datasource> 

这里是我的persistence.xml文件:

<?xml version="1.0" encoding="UTF-8"?> 
<persistence xmlns="http://xmlns.jcp.org/xml/ns/persistence" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/persistence 
      http://xmlns.jcp.org/xml/ns/persistence/persistence_2_1.xsd" 
    version="2.1"> 

    <persistence-unit name="MyPU" transaction-type="JTA"> 
     <provider>org.hibernate.ejb.HibernatePersistence</provider> 
     <jta-data-source>java:/jdbc/datasources/MyDataSourceDS</jta-data-source> 
     <shared-cache-mode>ALL</shared-cache-mode> 

     <properties> 
      <property name="jboss.entity.manager.factory.jndi.name" 
       value="java:/MyDataSourceEntityManagerFactory" /> 
      <property name="hibernate.dialect" value="org.hibernate.dialect.PostgreSQLDialect" /> 

      <property name="hibernate.jdbc.batch_size" value="50" /> 

      <property name="hibernate.hbm2ddl.auto" value="update" /> 
      <property name="hibernate.show_sql" value="false" /> 
      <property name="hibernate.format_sql" value="true" /> 

      <property name="hibernate.generate_statistics" value="true" /> 
      <property name="hibernate.connection.release_mode" value="auto" /> 

      <!-- Transactions --> 
      <property name="hibernate.transaction.jta.platform" 
       value="org.hibernate.service.jta.platform.internal.JBossAppServerJtaPlatform" /> 
      <property name="hibernate.transaction.flush_before_completion" 
       value="true" /> 
      <property name="hibernate.transaction.manager_lookup_class" 
       value="org.hibernate.transaction.JBossTransactionManagerLookup" /> 

      <property name="hibernate.max_fetch_depth" value="5" /> 

      <!-- Caching support - Infinispan --> 
      <property name="hibernate.cache.use_second_level_cache" 
       value="true" /> 

      <property name="hibernate.cache.infinispan.cachemanager" 
       value="java:jboss/infinispan/container/hibernate" /> 
      <property name="hibernate.cache.use_second_level_cache" 
       value="true" /> 

      <!-- Hibernate Search properties - Generic --> 
      <property name="hibernate.search.reader.strategy" value="shared" /> 
      <property name="hibernate.search.worker.execution" value="sync" /> 
      <property name="hibernate.search.jmx_enabled" value="true" /> 

      <!-- Hibernate Search properties - Infinispan --> 
      <property name="hibernate.search.infinispan.cachemanager_jndiname" 
       value="java:jboss/infinispan/hibernateSearch" /> 
      <property name="hibernate.search.default.directory_provider" 
       value="infinispan" /> 
      <property name="hibernate.search.infinispan.chunk_size" 
       value="300000000" /> 

     </properties> 
    </persistence-unit> 
</persistence> 

当JBoss的启动,我做没有看到任何错误。但是,我也没有看到任何对JDBC的引用。当持久化JPA对象时,我也没有看到任何错误,所以看起来他们正在被适当地索引。只是我的Hibernate搜索索引没有像我期望的那样被保存在数据库中。

任何人都可以点亮我在这里失踪的东西吗?

回答

2

正如您所注意到的,Hibernate Search为此目的使用的Infinispan扩展不包含在作为WildFly/JBoss EAP一部分的Infinispan模块中,因此您已正确从Infinispan项目下载了Infinispan模块。

你缺少的是,WildFly能够非常有效地隔离模块,所以你必须首先意识到的是,你不必与WildFly中包含的Infinispan版本相匹配。由于您将使用infinispan.org中的模块集,因此您不应将这些缓存配置到您的JBoss EAP配置文件中,因为在那里定义的缓存由集群子系统控制,并且会影响由该缓存定义创建的缓存定义包含在WildFly中的Infinispan模块(位于“main”插槽的Infinispan模块)。

您应该在基于Hibernate Search的应用程序中包含一个Infinispan配置文件,并使用正确的模块启动一个新的CacheManager。

或者,您可以创建另一个应用程序以任何喜欢的方式启动CacheManager - 只要您依赖正确的Infinispan模块(避开“主”插槽),然后将其注册到JNDI并让Hibernate Search寻找那个名字。

N.B. Hibernate的搜索模块具有依赖于可选 Infinispan的模块,所以它会尝试,如果它存在加载正确的Infinispan模块:

https://github.com/wildfly/wildfly/blob/84d88b8/feature-pack/src/main/resources/modules/system/layers/base/org/hibernate/search/engine/main/module.xml#L53

要知道还该感谢模块系统,你可以覆盖/升级Hibernate Search版本。 在版本方面的限制是:

  • 选择一个与你的Hibernate Search的版本选择

  • 的挑选与选择的Hibernate的ORM版本兼容的Hibernate Search的版本兼容的Infinispan的模块版本

(没错,you can override/upgrade Hibernate ORM as well)。

假设你正在使用Hibernate的ORM和Hibernate Search的默认版本包括在WildFly 10,你可以下载在版本8.2.6.Final(最新的稳定版本)使用Infinispan模块,它也包含一个模块

<module name="org.infinispan.hibernate-search.directory-provider" slot="for-hibernatesearch-5.5" > 

或者如果您使用的是JBoss EAP,您可能更愿意下载JBoss Data Grid发行版,它将包含与Infinispan模块相同的功能。

+0

我有Hibernate搜索写入Inifnispan缓存正确(我所知道的最好)。在磁盘上没有创建索引文件。当我执行Hibernate Search查询时,结果会按预期返回。所以,在我看来,好像数据*被存储在Infinispan中,它不会像我期望的那样被保存在我的SQL数据库中。所以在我看来,我的缓存容器定义有一个问题,导致它不使用JDBC缓存存储。我无法弄清楚具体是什么问题。 – Shadowman

+0

我还应该提到我没有使用infinispan.org提供的完整Infinispan模块。我只为没有包含在Wildfly Infinispan模块集中的JAR文件创建模块。另外,我没有在我的WAR文件中嵌入Hibernate/Hibernate搜索。我也在使用Wildfly提供的模块。 – Shadowman

+0

您应该在PostgreSQL数据库中拥有正确的表格,否则我们会看到一个错误。我不确定哪一个,但是它不是实际上使用Infinispan DirectoryProvider,或者我们错过了查看错误。我认为你检查了日志?索引操作发生在另一个线程中,因此您的主应用程序可能不会注意到。您需要检查日志或配置另一个ErrorHandler:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#exception-handling – Sanne