Asp.net 锁定获取失败异常后Lucene索引中断

Asp.net 锁定获取失败异常后Lucene索引中断,asp.net,asp.net-core,lucene,Asp.net,Asp.net Core,Lucene,我正在asp核心项目中使用Lucene。但每隔2-4天,我的指数就会被打破。因此,我记录了异常并获得了以下stacktrace: 2017-09-06 10:13:50.8338 |发生未处理的异常:锁定 获取超时: SimpleFSLock@e:\inetpub\Static\u Data\GKHUB\lucene\u index\write.lock: System.IO.IOException:锁文件 'e:\inetpub\Static\u Data\GKHUB\lucene\u ind

我正在asp核心项目中使用Lucene。但每隔2-4天,我的指数就会被打破。因此,我记录了异常并获得了以下stacktrace:

2017-09-06 10:13:50.8338 |发生未处理的异常:锁定 获取超时: SimpleFSLock@e:\inetpub\Static\u Data\GKHUB\lucene\u index\write.lock: System.IO.IOException:锁文件 'e:\inetpub\Static\u Data\GKHUB\lucene\u index\write.lock'alredy' 存在。发生异常:Lucene.Net.Store.lockOcctainFailedException

经过一些研究我发现

无法获取write.lock时引发此异常。当一个编写器试图打开另一个编写器已经打开的索引时,就会发生这种情况。[]

因此,第二个更新请求无法更新索引。但为什么之后整个指数都被打破了呢? 我的代码没有做任何特殊的事情:

public void UpdateIndex(Document doc, int idToUpadate)
{
    var indexwriterConfig = new IndexWriterConfig(LuceneVersion.LUCENE_48, Analyzer);
    indexwriterConfig.WriteLockTimeout = 5000; // doesn't fix the problem
    using (var writer = new IndexWriter(GetLuceneDirectory, indexwriterConfig)) {
        try {
            writer.UpdateDocument(new Term("Id", idToUpadate.ToString()), doc);
            writer.Commit();
        }
        catch (Exception e) {
            Debug.WriteLine(e);
            writer.Rollback();
        }
    }
}

正如你在问题中已经提到的:

无法启动write.lock时,将引发
lockActainFailedException
获得。当编写器试图打开一个 另一位作家已经公开了

如果您有多个更新,在代码中,您正在创建多个试图获得索引锁的
IndexWriter
实例,就会发生这种情况。您应该尝试重复使用单个编写器,而不是关闭和打开/创建一个新的编写器。这应该能解决你的问题

还有,别忘了

IndexWriter实例是完全线程安全的,这意味着多个 线程可以并发调用其任何方法


你有多少更新?实际上,您在每个更新方法上都创建了indexwriter的新实例,这不是一个好方法,一次创建一个理想的实例,如果有几个实例,则会发生此错误。为什么这是个坏主意?但我有两个索引。。。一个用于mediaContents,一个用于我的产品。(在不同的目录中)因此我需要至少2个indexWriter。正确的?每次我都必须将目录传递给编写器。是的,在这种情况下,两个索引编写器应该可以,只是不要在每次更新时创建一个