Hibernate Search:在应用程序之间共享索引

时间:2017-01-30 16:21:06

标签: hibernate jpa lucene hibernate-search infinispan

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

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

任何人都可以告诉我如何实现这一目标吗?是否可以直接在数据库中保存索引或启动客户端可以访问当前索引的某种服务?

2 个答案:

答案 0 :(得分: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
  4. 由于您提到客户端通过VPN运行,我不建议在集群模式下运行Infinispan,因为它意味着高性能(本地)链接,但您仍然可以在"本地模式"为每个人通过JDBC缓存存储读取更新的索引。然而,如果写入不是非常频繁,则该解决方案将是有效的,因为每个客户端将需要在每个索引更新上下载大块数据。 第二种解决方案需要每个客户端安装一个共享文件系统,同样需要下载和缓存。

答案 1 :(得分:0)

我认为测试我们新的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(与5.6.0.Final基本相同,并支持ORM 5.2.x)。

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