Использование методов IndexReader IsLocked и Unlock - PullRequest
2 голосов
/ 11 мая 2009

Перед тем, как позвонить AddDocument() на IndexWriter, ничего страшного, если я позвоню

IndexReader.IsLocked(myDirectory)

и если он вернет true, тогда вызовите

IndexReader.Unlock(myDirectory)

т.е.

if(IndexReader.IsLocked(myDirectory))
{
IndexReader.Unlock(myDirectory);
}

writer = new IndexWriter(myDirectory, _analyzer, true);
writer.AddDocument(doc);

Я продолжаю получать "Время ожидания блокировки истекло". ошибки в моем коде. Чтобы преодолеть эту ошибку, я планирую этот подход, если все в порядке.

Ответы [ 2 ]

3 голосов
/ 11 мая 2009

Ошибка «Блокировать получение тайм-аута» является предупреждением о том, что с вашим индексом что-то не так. Если у вас есть более одной IndexWriter записи в индекс, принудительная разблокировка может привести к повреждению вашего индекса.

Однако, по моему опыту, эти ошибки легко получить, когда вы работаете с кодом, поскольку случайные сбои и прерванные сеансы отладки могут оставить ваш индекс заблокированным, даже если никакой процесс больше не записывает в него.

Если это так, было бы нормально разблокировать индекс в начале процесса. Не вызывайте его каждый раз перед вызовом addDocument, только один раз при создании IndexWriter.

В любом случае, убедитесь, что вы правильно закрыли все IndexWriter перед выходом из процесса.

0 голосов
/ 13 июня 2009

Важно помнить, что с Lucene обновлять индекс должен только один поток ... поэтому на веб-сайте есть одновременные пользователи, но обновлять должен только один пользователь.

Если вы не обработаете это должным образом, у вас возникнут проблемы ... У вас может быть несколько операций чтения / запросов, но не записи

...