首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Lucene指数在LockObtainFailedException后破裂

Lucene指数在LockObtainFailedException后破裂
EN

Stack Overflow用户
提问于 2017-09-08 07:12:53
回答 1查看 495关注 0票数 0

我在用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 ]

因此,第二个更新请求无法更新索引。但为什么后来整个指数都被打破了呢?我的密码没什么特别的:

代码语言:javascript
复制
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();
        }
    }
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-09-08 07:33:09

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

当无法获取LockObtainFailedException时抛出write.lock。当作者试图打开另一个作者已经打开的索引时,就会发生这种情况。

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

还有,别忘了,

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46110673

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档