我想配置一個JDBC支持的Infinispan緩存作爲我的Java EE應用程序使用Hibernate Search的後端。我正在部署在JBoss EAP 7.0或Wildfly 10上。我有一個模塊,緩存容器和persistence.xml配置,在啓動時不會給我任何錯誤。另外,我可以創建JPA對象,並按照預期通過Hibernate Search對其進行索引。然後我可以成功查詢這些對象。但是,我從來沒有將數據庫中創建的SQL表配置爲緩存容器的JDBC數據源。所以,顯然,搜索索引只存在於內存中,並且不會在應用程序服務器重新啓動時持久存在。以下是我迄今爲止所做的:Infinispan/JDBC作爲後端Hibernate搜索Wildfly/JBoss
- 下載了與嵌入到JBoss EAP中的Infinispan版本相對應的Infinispan 8.1.x版本。這樣做是因爲Infinispan的休眠搜索模塊未包括嵌入式模塊
- 在我的JBoss EAP內配置的Infinispan的休眠搜索模塊相應的模塊
- 修改了我的獨立,全ha.xml JBoss的EAP配置文件包括JDBC支持的高速緩存容器和緩存定義
- 修改了我的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搜索索引沒有像我期望的那樣被保存在數據庫中。
任何人都可以點亮我在這裏失蹤的東西嗎?
我有Hibernate搜索寫入Inifnispan緩存正確(我所知道的最好)。在磁盤上沒有創建索引文件。當我執行Hibernate Search查詢時,結果會按預期返回。所以,在我看來,好像數據*被存儲在Infinispan中,它不會像我期望的那樣被保存在我的SQL數據庫中。所以在我看來,我的緩存容器定義有一個問題,導致它不使用JDBC緩存存儲。我無法弄清楚具體是什麼問題。 – Shadowman
我還應該提到我沒有使用infinispan.org提供的完整Infinispan模塊。我只爲沒有包含在Wildfly Infinispan模塊集中的JAR文件創建模塊。另外,我沒有在我的WAR文件中嵌入Hibernate/Hibernate搜索。我也在使用Wildfly提供的模塊。 – Shadowman
您應該在PostgreSQL數據庫中擁有正確的表格,否則我們會看到一個錯誤。我不確定哪一個,但是它不是實際上使用Infinispan DirectoryProvider,或者我們錯過了查看錯誤。我認爲你檢查了日誌?索引操作發生在另一個線程中,因此您的主應用程序可能不會注意到。您需要檢查日誌或配置另一個ErrorHandler:https://docs.jboss.org/hibernate/stable/search/reference/en-US/html_single/#exception-handling – Sanne