java - Lucene IndexWriter线程安全

标签 java lucene

Lucene 鼓励从多个线程中重用 IndexWriter。

假设两个线程可能有一个对 IndexWriter 的引用,如果线程 A 调用 writer 上的 close,线程 B 将留下一个无用的 writer。但据我所知,lucene 以某种方式知道另一个线程使用同一个编写器并推迟其关闭。

真的是这样吗? Lucene 如何跟踪另一个线程使用编写器?

编辑 从答案来看关闭IndexWriter是不正确的。但这带来了一个新问题:如果保持 IndexWriter 打开,基本上会阻止从另一个 JVM 访问该索引(例如,在集群的情况下,或许多应用程序之间的共享索引)。

最佳答案

如果一个线程关闭了 IndexWriter 而其他线程仍在使用它,您将得到不可预知的结果。我们尝试让其他线程命中 AlreadyClosedException,但这只是尽力而为(不保证)。 EG,您也可以轻松命中 NullPointerException。因此,您必须进行外部同步以确保您不会这样做。

最近(目前仅在 Lucene 的主干中,最终成为 4.0)修复了 IndexWriter 中的一个大线程瓶颈,允许段刷新并发运行(以前它们是单线程的)。在并发硬件上运行有多个索引线程的应用程序上,这可以大大提高索引吞吐量。参见 http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html了解详情。

关于java - Lucene IndexWriter线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5899777/

相关文章:

javascript - JSP Javascript,更新java对象值

java - 分页空间、JVM 和内存映射文件 (nio)

Java 小程序在最新版本的 mac Firefox 中非常慢

ruby-on-rails - Rails - 太阳黑子条件模型索引

lucene - 如何将ElasticSearch路由到特定节点(不是分片)?

asp.net-mvc-3 - 如何使用asp.net mvc3 和c# 构建网络爬虫?

java - 在java中使用秒表来记录绘图所用的时间

java - 我可以在 RESTful Web 服务中使用 wait() 吗?

java - Elasticsearch 中的模式匹配?

c# - 在 ASP.NET MVC 站点中正确构建 Lucene.Net 使用