C# Lucene.Net,我需要关闭IndexWriter吗

C# Lucene.Net,我需要关闭IndexWriter吗,c#,lucene,lucene.net,C#,Lucene,Lucene.net,我们在Lucene.Net抛出一个LockActainFailedException时遇到锁定问题。这是一个多租户网站,每个客户都可以在光盘上获得自己的物理搜索索引,并使用静态索引编写器列表,每个索引一个以控制更改 我们在IndexWriter AddDocument(); DeleteDocuments(); DeleteAll(); Optimize(); Commit(); 我注意到,我们从未在IndexWriter上调用Close()或Dispose(),我想知道这是否是良好的做法,是

我们在
Lucene.Net
抛出一个
LockActainFailedException
时遇到锁定问题。这是一个多租户网站,每个客户都可以在光盘上获得自己的物理搜索索引,并使用
静态
索引编写器列表,每个索引一个以控制更改

我们在
IndexWriter

AddDocument();
DeleteDocuments();
DeleteAll();
Optimize();
Commit();
我注意到,我们从未在
IndexWriter
上调用
Close()
Dispose()
,我想知道这是否是良好的做法,是否可能是问题的原因


感谢Dave在不再需要对象时使用Close/Dispose始终是一个好主意。开发人员公开这些方法是有原因的。通常,文档会给出使用这些方法的额外提示

我还建议使用
-block在
中使用每个
idisposable
-object,它只调用
Dispose()

这使对象能够清理和释放资源。对于框架对象来说,这并不重要,因为垃圾收集器迟早会关心的,但是对于系统对象或句柄,如文件系统句柄
Dispose
就变得很重要了。这些手柄可能保持打开状态

对于Lucene IndexWriter,我不能完全确定,但是当它使用一个文件作为索引时(这是我的假设),那么您就有了应该调用
Dispose
的原因


当手柄/连接等保持打开状态时,可能会导致此类异常。因此,是的,您应该使用
Close()
/
Dispose()

文档会说是的,但只有在您关闭应用程序本身时才会这样做,否则,不会。以下是Lucene.Net 4.8中IndexWriter.Dispose的文档:

提交对索引的所有更改,等待挂起的合并完成, 并关闭所有相关文件

这是一个“缓慢而优雅的关机”,可能需要很长时间

请注意,这可能是一个成本高昂的操作,因此,请尝试重新使用单个 而不是关闭和打开一个新的。有关详细信息,请参见
Commit()
关于某些IO设备进行写缓存的注意事项

因此,您应该调用
.Dispose()
,但通常在关闭应用程序时只调用一次

您已经在调用
.Commit()
,他们建议您改为调用。我猜你的问题实际上与线程有关。我只是在学习Lucene,但如果我处在你的位置,我会尝试在对Lucene的任何写调用周围设置一个标准的.Net锁,这样一次只有一个线程可以访问写操作。如果它解决了您的问题,您就知道它是线程


锁是非常痛苦的,Lucene写入可能需要很长时间,因此如果锁解决了这个问题,它可能会引入其他问题,例如两个线程试图写入,一个线程挂起或失败,这取决于代码的编写方式。如果出现这种情况,您可能希望实现一个写队列,这样线程就可以快速地将想要写入的内容转移到廉价的数据结构(如ConcurrentQueue)中,然后让那些写操作启动写操作(如果没有写操作),并保持排队状态,直到所有内容都被写出来,然后返回睡眠状态。

谢谢,我了解IDisposable和Dispose模式,我在寻找Lucene特有的答案。