为什么我的Lucene索引被锁定?

时间:2010-02-26 11:22:13

标签: nhibernate lucene

我的搜索问题没有返回我期望的结果。

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

我尝试删除索引文件夹并运行我的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>();

怎么回事?我做错了什么?

由于

3 个答案:

答案 0 :(得分:4)

Lucene.Net索引仅阻止对索引的并发写入操作。您可以拥有从索引中搜索/读取的多个线程,它们不会阻塞 - 无论是在彼此还是在执行写入的任何人,但是如果您有两个线程同时在索引上写入,那么有可能其中一人会阻挡另一人。

如果lucene告诉你你的索引被锁定,那么这意味着有人正在写入索引,或者(这听起来更可能)写入索引的内容在写入期间被杀死,因此无法删除锁定。 您应该确保在完成后立即妥善处理写入索引的任何Lucene对象。

要手动删除锁,你需要在Lucene目录中删除一个.lock文件(目前我的Lucene大书并不在我身边,所以我不确切知道它在哪里,但是在做什么在Lucene目录中搜索“lock”或“.lock”应该找到它)

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)