Безопасность потока Lucene IndexWriter

Lucene поощряет повторное использование IndexWriter из нескольких потоков.

Учитывая, что два потока могут иметь ссылку на IndexWriter, если поток A нажимает на писателя, поток B останется с бесполезным автором. Но, к моему пониманию, Люцен каким-то образом знает, что другой поток использует одного и того же автора и откладывает его закрытие.

Действительно ли это так? Как lucene отслеживает, что другой поток использует писателя?

ИЗМЕНИТЬ Судя по ответам, неправильно закрыть IndexWriter. Но это создает новую проблему: если вы держите IndexWriter открытым, по существу блокирует доступ к этому индексу из другой JVM (например, в случае кластера или общий индекс между многими приложениями).

Ответ 1

Если один поток закрывает IndexWriter, в то время как другие потоки все еще используют его, вы получите непредсказуемые результаты. Мы стараемся, чтобы другие потоки попали в AlreadyClosedException, но это просто лучшее усилие (не гарантируется). EG, вы также можете легко удалить NullPointerException. Таким образом, вы должны синхронизировать извне, чтобы убедиться, что вы этого не делаете.

Недавно (только в Lucene trunk прямо сейчас, чтобы быть в конечном итоге 4.0), узкое место в потоке в IndexWriter было исправлено, позволяя одновременному запуску сегментных потоков (ранее они были однопоточными). В приложениях, работающих со многими потоками индексирования на параллельном оборудовании, это может значительно повысить производительность индексирования. Подробнее см. http://blog.mikemccandless.com/2011/05/265-indexing-speedup-with-lucenes.html.

Ответ 2

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

Ответ 3

Вы имеете в виду флаг waitForMerges в методе IndexWriter.close()?

Закрывает индекс с или без ожидания завершения текущих сличений. Это имеет смысл только при использовании MergeScheduler, который запускает слияния в фоновом потоке.

Lucene обычно использует фоновые потоки для консолидации фрагментированных записей, которые произошли в нескольких потоках - сами записи происходят немедленно, но консолидация происходит асинхронно.

При закрытии записи вы должны разрешить ей завершить процесс консолидации, иначе:

опасно всегда называть close (false), особенно когда IndexWriter не открыт очень долго, потому что это может привести к "слиянию голода", при котором длинные слияния никогда не смогут закончить. Это вызовет слишком много сегментов в вашем индексе.

Таким образом, писатель не "знает" о ваших потоках, в том смысле, что вы имели в виду.