Безопасность потока 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 не открыт очень долго, потому что это может привести к "слиянию голода", при котором длинные слияния никогда не смогут закончить. Это вызовет слишком много сегментов в вашем индексе.
Таким образом, писатель не "знает" о ваших потоках, в том смысле, что вы имели в виду.