【问题标题】:Why is Lucene.Net indexer throwing a System.IO.IOException was unhandled?为什么 Lucene.Net 索引器抛出 System.IO.IOException 未处理?
【发布时间】:2013-02-07 09:54:31
【问题描述】:

有时会抛出异常,说文件write.lock 不能使用,因为它正在被另一个进程使用,但是这是一个非常简单的 Lucene.Net 测试应用程序,没有其他进程在使用它,任何想法这是怎么回事

异常详情如下:

System.IO.IOException was unhandled
HResult=-2147024864
Message=The process cannot access the file 
     'c:\temp\luceneidx\write.lock' because it is being used by another process.

Source=mscorlib
StackTrace:
    at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
    at System.IO.File.InternalDelete(String path, Boolean checkHost)
    at System.IO.File.Delete(String path)
    at Lucene.Test.LuceneSearchInternal.get__directory() 
    in C:\Lucene.Test\LuceneSearchResumes.cs:line 35

抛出异常的相关代码是,

var lockFilePath = Path.Combine(_luceneDir, "write.lock");

if (File.Exists(lockFilePath))
    File.Delete(lockFilePath);   // THROWS exception sometimes

代码大多来自this article

索引正在使用Task.Factory.StartNew() 在后台线程上构建,并且 WPF GUI 在构建索引时进行搜索。只有一个线程将文档写入索引。

问题:还有哪个进程在使用 Lucene.Net 索引?

【问题讨论】:

  • Lucene.Net 支持多线程,因此您的后台线程可以在您的 WPF 线程搜索时构建索引(我认为这称为“实时”搜索)。即使您不搜索,WPF 线程也可能在后台线程尝试删除锁之前打开了索引;这是一个可能的原因。
  • 需要拨打File.Delete。这是FSDirectory 对象的健全性检查getter 的一部分;我认为它会检查锁定文件,以防某些进程在未解锁索引的情况下提前崩溃。我没有检查 CodeProject 代码,但我认为它可以工作并且你已经更改了它。可能最简单的解决方法是确保所有线程(后台线程、WPF 线程)使用相同的 FSDirectory 对象。
  • 我只是快速阅读了 CodeProject 的那篇文章,这东西充满了失败。我绝对不会参考它来学习 Lucene 的基础知识。它不遵循文档/字段实例重用等基本最佳实践,它不断关闭 IndexWriters/IndexSearchers 等。
  • 我同意@JfBeaulac:你最好从最初的 Lucene 项目中学习,该项目在概念和代码上都与 Lucene.Net 有很多相似之处。查看this tutorial
  • @rae1n 链接的教程是一个非常好的起点。如果可以的话,我还建议您获取 Lucene in action 一书。它包含您需要了解的所有内容 + 可免费下载的精彩代码示例:manning-source.com/books/hatcher2/LuceneInAction.zip

标签: c# .net visual-studio-2010 lucene lucene.net


【解决方案1】:

假设提供的代码与搜索过程(而不是索引过程)相关,您不应该在每次尝试访问索引时都尝试删除锁定文件。抛出异常是因为后台线程当前正在写入索引,而当线程本身应该处理删除时,您正在任意尝试删除其锁定文件。

在您发布的文章中,该机制用于在系统/应用程序在写入索引时恢复 Lucene 索引,使其锁定。然而,这几乎不是常见的情况。我相信在 CodeProject 文章中假设对索引进行单线程访问,因此采用了这种方法。

在您的项目中,您需要能够检查锁定文件的存在是由于当前的写访问还是由于以前的应用程序/系统崩溃。您可以在代码中使用lock 对象,该对象在发生崩溃时动态释放,以区分这两种情况。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-09
    • 2018-03-06
    • 2019-06-20
    • 1970-01-01
    • 2012-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多