Пишите индекс Lucene одновременно - PullRequest
4 голосов
/ 02 февраля 2012

Индекс совместно используется несколькими IndexWriters. Очевидно, LockObtainFailedException будет выброшено, если индекс открытия собирается открыться другим IndexWriter. Мое решение состоит в том, чтобы создать IndexWriter с длительным временем ожидания:

IndexWriterConfig conf= new IndexWriterConfig(Version.LUCENE_30, new SimpleAnalyzer (Version.LUCENE_30));
conf.setWriteLockTimeout(30*1000);//Wait 30 seconds timeout
try{
        IndexWriter writer = new IndexWriter(dir, conf);
}catch(LockObtainFailedException e){
        System.out.println("give up trying...");
}

Есть ли лучшее решение для этого случая?

РЕДАКТИРОВАТЬ: вдохновленный Тило. Я нашел JavaDoc для IndexWriter:

Экземпляры IndexWriter полностью потокобезопасны , что означает, что несколько потоков могут одновременно вызывать любой из его методов. Если вашему приложению требуется внешняя синхронизация, вам не следует выполнять синхронизацию на экземпляре IndexWriter, так как это может привести к тупику; используйте вместо этого ваши собственные (не Lucene) объекты.

Ответы [ 2 ]

3 голосов
/ 02 февраля 2012

Один Directory не может быть общим для нескольких IndexWriters. Просто поделитесь одним IndexWriter среди своих тем.

0 голосов
/ 06 июля 2014

IndexWriter полностью ThreadSafe, поэтому многопоточная работа над ним безопасна, но вы не можете иметь более одного IndexWriter над одним и тем же индексом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...