我在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();
}
}
}
答案 0 :(得分:1)
正如您在问题中已经提到的那样:
当write.lock不能时,抛出
LockObtainFailedException
收购。当作者试图打开索引时会发生这种情况 另一位作家已经开放了。
如果您有多个更新,在您的代码中,您正在创建尝试获取索引锁定的IndexWriter
的多个实例。您应该尝试重复使用单个编写器,而不是关闭和打开/创建新编写器。这应该可以解决你的问题。
另外,不要忘记,
IndexWriter实例完全是线程安全的,意味着多个 线程可以同时调用它的任何方法