我在用Lucene做asp核心项目。但每2-4天我的指数就坏了。因此,我记录了异常并获得了以下堆栈跟踪:
一个未处理的异常发生了:锁获取超时: 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 OCCURRED:Lucene.Net.Store.LockObtainFailedException
经过一些研究,我发现
当无法获取write.lock时,将引发此异常。当作者试图打开另一个作者已经打开的索引时,就会发生这种情况。[ src ]
因此,第二个更新请求无法更新索引。但为什么后来整个指数都被打破了呢?我的密码没什么特别的:
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();
}
}
}发布于 2017-09-08 07:33:09
正如你在问题中已经提到的:
当无法获取
LockObtainFailedException时抛出write.lock。当作者试图打开另一个作者已经打开的索引时,就会发生这种情况。
如果您有多个更新,那么就会发生这种情况,在代码中,您正在创建多个试图获取索引锁的IndexWriter实例。你应该试着重复使用一个作者,而不是关闭和打开/创建一个新的。这应该能解决你的问题。
还有,别忘了,
IndexWriter实例是完全线程安全的,这意味着多个线程可以同时调用它的任何方法。
https://stackoverflow.com/questions/46110673
复制相似问题