2015-06-24 2 views
0

У нас есть проблемы с блокировкой Lucene .Net, бросая LockObtainFailedException. Это многоэтажный сайт, и каждый клиент получает свой собственный индекс физического поиска на диске, и используется список static из IndexWriters, по одному на индекс для управления изменениями.Lucene .Net, мне нужно закрыть IndexWriter

Мы называем следующие функции на IndexWriter

AddDocument(); 
DeleteDocuments(); 
DeleteAll(); 
Optimize(); 
Commit(); 

Я заметил, что мы никогда не называем Close() или Dispose() на IndexWriter, и хотел бы знать, если это хорошая практика, и может быть причиной проблем, ,

Благодаря Dave

ответ

0

Для использования Close/Dispose, когда вам не нужно объект больше всегда является хорошей идеей. Существует причина, по которой разработчик предоставляет эти методы. Как правило, в документации приводятся дополнительные рекомендации по использованию этих методов.

Я также рекомендую использовать каждый IDisposeable -объект в using -блоке, который только что называет Dispose().

Это дает объектам возможность очищать и освобождать ресурсы. В случае каркасных объектов это не очень важно, так как сборщик мусора рано или поздно будет заботиться, но в случае системных объектов или ручек, таких как дескрипторы файловой системы Dispose, становится важным. Эти ручки могут оставаться открытыми.

В случае с Lucene IndexWriter я не совсем уверен, но когда он использует файл для своего индекса (это то, что я предполагаю), то у вас есть причина, почему следует вызывать Dispose.

Когда ручки/соединения/etc остаются открытыми, это может привести к таким исключениям. Итак, да, вы должны использовать Close()/Dispose()

+0

Спасибо, я понимаю IDisposable и шаблон Dispose, я искал ответ, характерный для Lucene. – DavidB