Asp.net 锁定获取失败异常后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 index\write.lock'alredy' 存在。发生异常:Lucene.Net.Store.lockOcctainFailedException 经过一些研究我发现 无法获取write.lock时引发此异常。当一个编写器试图打开另一个编写器已经打开的索引时,就会发生这种情况。[] 因此,第二个更新请求无法更新索引。但为什么之后整个指数都被打破了呢? 我的代码没有做任何特殊的事情: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
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。正确的?每次我都必须将目录传递给编写器。是的,在这种情况下,两个索引编写器应该可以,只是不要在每次更新时创建一个