Hibernate Search(Lucene)近实时索引管理器和Tomcat并行部署

时间:2017-02-28 11:04:19

标签: java hibernate tomcat lucene hibernate-search

首先有一点背景知识:我目前正在Java Web应用程序中使用 Hibernate Search 4.2 ,并处理写入大量Lucene索引,其中存储了大量数据。使用基于目录的索引管理器时,存储在我的最大索引中的单个对象的索引操作大约需要<1秒。

为了提高性能,我将indexmanager切换到接近实时并且性能提升了跳跃式的边界,但现在我想使用Tomcat Parallel Deployments实现零停机部署(这允许我在单个Tomcat中并排使用同一个应用程序的2个不同版本,我发现我不能再使用近实时索引管理器了,因为它会缓存内存中的修改并避免刷新到磁盘直到缓冲区ram已满或应用程序关闭。

我的问题是:在这种情况下,我有哪些替代解决方案?我想保持索引过程尽可能同步

我已经看过Hibernate Search的代码,我已经看到有不同的提交策略和一个名为IndexWriterHolder的类允许我提交和刷新写入,但我不确定这些API是否或如何被公开曝光。

我也看到Lucene 4实现了并发刷新,我在Hibernate Search 5中发现了 max_thread_states 标志,它允许我指定并发写入器的数量每个IndexWriter的线程,但我以前从未使用它,我不确定并发刷新是否会对我的情况有所帮助。

非常感谢任何帮助。谢谢。

1 个答案:

答案 0 :(得分:0)

好问题。简短的回答是,这目前是不可能的。

IndexWriterHolder 确实不是公共API,因为它在后台线程中处理队列而暴露是很棘手的:直接调用它而不是通过将事件调度到队列中会很活泼。

Lucene的并发冲洗功能在安全时自动使用;例如在MassIndexing期间;我不认为 max_thread_states 属性对你有多大帮助,但值得尝试其他调优选项。

我是Hibernate Search开发人员之一,并不了解Tomcat的Parallel Deployments:这听起来像是一个有趣的功能,我们可以探索支持。请在JIRA上打开功能请求,或者在forums上开始对话,以便更好地了解这是如何运作的。