LockObtainFailedException后Lucene索引中断

时间:2017-09-08 07:12:54

标签: asp.net asp.net-core lucene

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

  

2017-09-06 10:13:50.8338 |发生了未处理的异常:锁定   获得超时:   SimpleFSLock @ E:\的Inetpub \ Static_Data \ GKHUB \ lucene_index \ write.lock:   System.IO.IOException:lockFile   'e:\ inetpub \ Static_Data \ GKHUB \ lucene_index \ write.lock'alredy   exists.EXCEPTION发生:Lucene.Net.Store.LockObtainFailedException

经过一些研究后我发现了那个

  

无法获取write.lock时抛出此异常。当作者试图打开另一个作者已经打开的索引时会发生这种情况。[src]

因此第二个Update-Request无法更新索引。但为什么整个指数随后都会被打破? 我的代码没有做任何特别的事情:

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();
        }
    }
}

1 个答案:

答案 0 :(得分:1)

正如您在问题中已经提到的那样:

  当write.lock不能时,抛出

LockObtainFailedException   收购。当作者试图打开索引时会发生这种情况   另一位作家已经开放了。

如果您有多个更新,在您的代码中,您正在创建尝试获取索引锁定的IndexWriter的多个实例。您应该尝试重复使用单个编写器,而不是关闭和打开/创建新编写器。这应该可以解决你的问题。

另外,不要忘记,

  

IndexWriter实例完全是线程安全的,意味着多个   线程可以同时调用它的任何方法