【问题标题】:Hibernate Search: Share index between applicationsHibernate Search:在应用程序之间共享索引
【发布时间】:2017-06-15 21:24:46
【问题描述】:

我们正在开发一个使用 Hibernate/JPA 访问数据库的 JavaFX 解决方案。我们使用 Hibernate Search 和 Lucene 来搜索实体,只要只有一个程序实例在运行,它就可以很好地工作。如果启动第二个实例,搜索仍然有效,但更新实体失败,因为第一个启动的应用程序保留了索引上的写锁。我们没有使用任何类型的 JavaEE 应用服务器,JavaFX 客户端直接通过 Hibernate 访问数据库。

在最终的生产环境中,将有一个 MS-SQL 服务器保存所有数据,以及多个富客户端在虚拟机中的服务器上运行或通过 VPN 访问数据库服务器。我想让所有客户端都可以添加和编辑实体并立即获取索引更新。我已经尝试使用 Infinispan 找到解决方案,但并没有真正掌握从哪里开始以及具体做什么。

谁能告诉我如何实现这一点?是否可以将索引直接保存在数据库中或启动某种服务,客户端可以访问当前索引?

【问题讨论】:

    标签: hibernate jpa lucene hibernate-search infinispan


    【解决方案1】:

    有多种选择。

    1. 就像 Guillaume Smet 建议的那样,将索引外部化到 Elasticsearch 集群。这可以扩大规模,但对于小型部署来说可能有点过头了。
    2. 设置配置属性hibernate.search.default.exclusive_index_use=false并将应用指向同一个目录;他们将能够共享它,但他们将不得不“轮流”进行写操作。另见Table 3.7. List of indexing performance and behavior properties
    3. 将索引存储在 Infinispan 目录(内存分布式数据网格)中。分发方面可能有点矫枉过正,但它能够将存储卸载到关系数据库。见Infinispan Lucene DirectoryJDBC Cache Store

    由于您提到运行在 VPN 上的客户端,我不建议在集群模式下运行 Infinispan,因为它意味着高性能(本地)链接,但您仍然可以在“本地模式”下为每个客户端使用它通过 JDBC 缓存存储读取更新的索引。然而,这种解决方案只有在写入不是很频繁的情况下才会有效,因为每个客户端都需要在每次索引更新时下载大量数据。 第二种解决方案需要每个客户端挂载一个共享文件系统,这同样需要下载和缓存。

    【讨论】:

      【解决方案2】:

      我认为这可能是您测试我们新的 Elasticsearch 集成的一个很好的用例。

      我们今天发布了支持 Elasticsearch 的 5.6.0.Final。有关更多信息,请参阅http://in.relation.to/2017/01/30/hibernate-search-5-6-0-Final-and-5-7-0-CR1/

      请注意,如果您使用 ORM 5.2.x,则需要使用我们的 5.7.0.CR1(与支持 ORM 5.2.x 的 5.6.0.Final 基本相同)。

      目前这种支持仍处于试验阶段(试验性意味着我们可能会在下一个版本中更改一些 API),但我认为对于您的用例来说绝对值得一试。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2018-01-29
        • 2020-06-08
        • 1970-01-01
        • 2021-06-22
        • 2011-03-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多