【问题标题】:Why is my Lucene index getting locked?为什么我的 Lucene 索引会被锁定?
【发布时间】:2010-02-26 11:22:13
【问题描述】:

我的搜索出现问题,没有返回预期的结果。

我试图在我的索引上运行 Luke,但它说它已被锁定,我需要强制解锁它(虽然我不是绝地/西斯)

我试图删除 index 文件夹并运行我的 recreate-indicies 应用程序,但该文件夹已被锁定。使用解锁器我发现有大约 100 个 w3wp.exe 条目(相同的 PID,不同的句柄)在索引上被锁定。

怎么了?

我在我的 NHibernate 配置中这样做:

c.SetListener(ListenerType.PostUpdate, new FullTextIndexEventListener());
c.SetListener(ListenerType.PostInsert, new FullTextIndexEventListener());
c.SetListener(ListenerType.PostDelete, new FullTextIndexEventListener());

这是我查询索引的唯一地方:

var fullTextSession = NHibernate.Search.Search.CreateFullTextSession(this.unitOfWork.Session);

var fullTextQuery = fullTextSession.CreateFullTextQuery(query, typeof (Person));
fullTextQuery.SetMaxResults(100);

return fullTextQuery.List<Person>();

发生了什么事?我做错了什么?

谢谢

【问题讨论】:

  • 你可能不是绝地武士,但卢克是

标签: nhibernate lucene


【解决方案1】:

Lucene.Net 索引仅阻止对索引的并发写入 操作。您可以拥有任意数量的线程,从索引中搜索/读取,并且它们不会阻塞 - 无论是在彼此之间还是在任何进行写入的人身上,但是如果您有两个线程同时在索引上进行写入,那么就会有他们中的一个会阻止另一个的机会。

如果 lucene 告诉您您的索引已锁定,则这意味着有人当前正在写入索引,或者(这听起来更有可能)正在写入索引的某些内容在写入期间被杀死,因此无法删除锁定. 您应该确保在写入索引后立即正确处理所有写入索引的 Lucene 对象。

要手动删除锁定,您需要在 Lucene 目录中删除一个 .lock 文件(我的 Lucene 大书目前不在我附近,所以我不知道它到底在哪里,但是做在 Lucene 目录中搜索“lock”或“.lock”应该会找到它)

w3wp.exe 在此目录上的句柄可能是从 lucene 索引读取的线程拥有的句柄 - 尽管这些会阻止您删除目录,但它们不应阻止您搜索或写入索引.

【讨论】:

  • 太好了,感谢您的解释 :) 编写的部分是 NH.Search FullTextIndexEventListener,您是说这可能不是线程安全的,并且两个写入同时发生,一个被阻塞然后没有正确处理?
  • hmmm 查看源代码,它似乎确实考虑了线程(并不意味着它没有错误)。关于如何调试它的任何建议?我没有看到索引写入失败的任何原因(在我的代码中)
【解决方案2】:

删除索引文件夹中的“write.lock”文件。

【讨论】:

  • 问题是“为什么会被锁定?”不是,“告诉我一个任意的手动解决方案”
  • 检查任何写操作。正如@Kragen 提到的,您的索引写入操作更有可能终止并离开了 write.lock 文件。我将从删除 write.lock 开始,看看它是否被重新创建;如果是这样,那么我会寻找访问索引的进程。
【解决方案3】:

【讨论】:

  • 将原因解释为摘要而不是仅仅参考一些可能回答问题的文章会很有用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 2023-02-16
  • 1970-01-01
  • 1970-01-01
  • 2011-08-17
  • 2012-10-28
相关资源
最近更新 更多