在将 Lucene.Net 与 ASP.NET 一起使用时,我可以想象一个 Web 请求可以触发对索引的更新,而另一个 Web 请求正在执行搜索。Lucene.Net 是否内置了管理并发访问的能力,还是我必须管理它,以避免“被另一个进程使用”错误?
编辑:在阅读文档和实验之后,这就是我认为我学到的:有两个问题,线程安全和并发。多线程是“安全的”,因为您不能对索引做任何坏事。但是,这是安全的,代价是一次只有一个对象锁定索引。第二个对象会出现并抛出异常。因此,您不能打开搜索并期望另一个线程中的作者能够更新索引。如果一个线程忙于更新索引,那么尝试创建搜索器将会失败。
此外,搜索者会看到他们打开时的索引,因此如果您保留它们并更新索引,他们将不会看到更新。
我希望我的搜索者看到最新的更新。
我的设计,到目前为止似乎还有效,是我的作者和搜索者共享一个锁,这样他们就不会失败——他们只是等待——直到当前的写入或搜索完成。