Infinispan/JDBC作为Wildfly/JBoss上Hibernate搜索的后端

Infinispan/JDBC作为Wildfly/JBoss上Hibernate搜索的后端,jdbc,jboss,wildfly,hibernate-search,infinispan,Jdbc,Jboss,Wildfly,Hibernate Search,Infinispan,我正在尝试配置一个JDBC支持的Infinispan缓存,作为使用Hibernate搜索的JavaEE应用程序的后端。我正在JBoss EAP 7.0或Wildfly 10上部署。我有一个模块、缓存容器和persistence.xml配置,在启动时不会给我任何错误。此外,我能够创建JPA对象,并按照预期通过Hibernate搜索对它们进行索引。然后我就能够成功地查询这些对象。但是,任何时候都不会在我配置为缓存容器的JDBC数据源的数据库中创建SQL表。因此,很明显,搜索索引只存在于内存中,不会在

我正在尝试配置一个JDBC支持的Infinispan缓存,作为使用Hibernate搜索的JavaEE应用程序的后端。我正在JBoss EAP 7.0或Wildfly 10上部署。我有一个模块、缓存容器和persistence.xml配置,在启动时不会给我任何错误。此外,我能够创建JPA对象,并按照预期通过Hibernate搜索对它们进行索引。然后我就能够成功地查询这些对象。但是,任何时候都不会在我配置为缓存容器的JDBC数据源的数据库中创建SQL表。因此,很明显,搜索索引只存在于内存中,不会在应用服务器重启时持久化。以下是我迄今为止所做的工作:

  • 下载了Infinispan 8.1.x版本,该版本与JBoss EAP中嵌入的Infinispan版本相对应。之所以这样做是因为Infinispan的hibernate搜索模块不包括在嵌入式模块中
  • 我已经为JBoss EAP中的Infinispan hibernate搜索模块配置了适当的模块
  • 修改了我的standalone-full-ha.xml JBoss EAP配置文件,以包含JDBC支持的缓存容器和缓存定义
  • 修改了my persistence.xml文件以使用Infinispan缓存管理器和目录提供程序
  • 以下是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>
    
    <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>
    
    
    
    以下是我从standalone-full-ha.xml获得的JDBC数据源:

     <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>
    
    <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>
    
    
    jdbc:postgresql://localhost:5432/db_infinispan_cache
    postgresql-jdbc4
    10
    20
    真的
    空闲连接
    infinispan_缓存
    我的密码
    真的
    真的
    
    这是我的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>
    
    
    org.hibernate.ejb.HibernatePersistence
    java:/jdbc/datasources/mydatasources
    全部的
    
    当JBoss启动时,我没有看到任何错误。然而,我也没有看到任何关于JDBC的参考。在持久化JPA对象时,我也没有看到任何错误,因此它们似乎被适当地索引了。只是我的Hibernate搜索索引没有像我预期的那样保存在数据库中


    有人能解释一下我在这里遗漏了什么吗?

    正如您所注意到的,Hibernate搜索为此目的使用的Infinispan扩展不包括在Infinispan模块中,它是WildFly/JBoss EAP的一部分,因此您正确地从Infinispan项目下载了Infinispan模块

    您缺少的是WildFly能够非常有效地隔离模块,因此您必须意识到的第一件事是,您真的不必匹配WildFly中包含的Infinispan版本

    由于您将使用infinispan.org中的模块集,因此不应在JBoss EAP配置文件中配置这些缓存,因为其中定义的缓存由集群子系统控制,并将影响WildFly中包含的infinispan模块(插槽“main”中的infinispan模块)创建的缓存定义

    您应该在基于Hibernate搜索的应用程序中包含Infinispan配置文件,并让它使用正确的模块启动新的CacheManager

    或者,您可以创建另一个应用程序,以任意方式启动CacheManager—只要您依赖正确的Infinispan模块(避免使用“主”插槽)—然后将其注册到JNDI并让Hibernate Search查找该名称

    注意:Hibernate搜索模块依赖于可选的Infinispan模块,因此它将尝试加载正确的Infinispan模块(如果存在):

    还要注意,由于模块系统,您可以覆盖/升级Hibernate搜索版本。 就版本而言,您的限制是:

    • 选择与所选Hibernate搜索版本兼容的Infinispan模块版本

    • 选择与所选Hibernate ORM版本兼容的Hibernate搜索版本

    (没错,)

    假设您使用的是WildFly 10中包含的默认版本的Hibernate ORM和Hibernate Search,您可以在8.2.6.Final(最新稳定版本)下载Infinispan模块,因为它还包含一个模块

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

    或者,如果您正在使用JBoss EAP,您可能更愿意下载JBoss数据网格发行版,该发行版将包含与Infinispan模块相同的功能。

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

    您缺少的是WildFly能够非常有效地隔离模块,因此您必须意识到的第一件事是,您真的不必匹配WildFly中包含的Infinispan版本