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

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

巴宏恺
2023-03-14

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

  1. 下载了与嵌入在JBoss EAP中的Infinispan版本对应的Infinispan 8.1. x版本。这样做是因为Infinispan的hibernate搜索模块不包含在嵌入式模块中
  2. 我已经为JBoss EAP中的Infinispan hibernate-search模块配置了适当的模块
  3. 修改了我的standalone-full-ha.xmlJBoss EAP配置文件,以包含JDBC支持的缓存容器和缓存定义
  4. 修改了我的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>

这是我来自standalone-full-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>

这是我的坚持。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搜索索引没有像我预期的那样保存在数据库中。

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

共有1个答案

武功
2023-03-14

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

您缺少的是WildFly能够非常有效地隔离模块,因此您首先必须意识到的是,您真的不必与WildFly中包含的Infinispan版本相匹配。

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

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

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

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搜索版本。就版本而言,您的限制是:

>

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

(没错,您也可以覆盖/升级Hibernate ORM)。

假设您使用的是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 Data Grid发行版,该发行版将包含与Infinispan模块相同的功能。

 类似资料:
  • 我试图在JBoss EAP 7(或Wildfly 10)服务器上创建一个JDBC支持的Infinispan缓存。我的

  • 我在JBoss EAP 7.0.6上部署了一个Hibernate 5.0.9.Final应用程序(默认为Infinispan 8.0.1.Final)。必须缓存两个实体,它们用JPA的Cacheable和Hibernate的Cache注释,以提供每个实体的缓存策略。 代码库包含一个简单的测试,它检查本地运行的Infinispan与直接访问数据源的testscase一起运行,也就是说,中间没有JBo

  • 我有一个部分与org.infinispan.jmx有关的问题。JmxDomainConflictException:域已注册org.infinispan异常?不同的是,我在JBoss 7.1.1中使用hibernate 4.3.6。我有两个应用程序,它们具有持久性。xml大致如下: 当第二个应用程序的持久性单元由hibernate加载时,会发生异常。现在,网络上的解决方案经常提到将其添加到infi

  • 尝试使用infinispan作为Hibernate的二级缓存,但总是给我以下错误 org.infinispan.jmx.JMX MBean实例类型=CacheManager, name="DefaultCacheManager"已经在'org.infinispan'JMX域下注册。如果您想允许多个配置了相同JMX域的实例,请在org.infinispan.jmx.JmxUtil.buildJmxD

  • 问题是如果我在@field中使用了index=index.un_tokenized,那么就无法进行搜索。如果我使用了index.tokenized,那么我就不能用“the”和“a”进行搜索。 有人能给我一些指导吗?提前道谢。 下面是代码片段: @column(name=“title”)私有字符串标题; 要搜索的代码:FullTextEntityManager FullTextEntityManag

  • 我使用< code > Hibernate Search 4 . 5 . 1 编写了< code>Spring web-app。当我尝试搜索时,它返回一个条目列表。我认为索引中的问题。用于索引的目录已创建,但实体保存文件后,目录中的文件不变。 这是我的Spring配置文件 我的实体文件