>> Но у вас есть несколько серверов Solr, пишущих в одно и то же место, верно?
Нет, не так. Solr использует библиотеки Lucene, и в «Lucene in Action» * указано, что одновременно в индекс может быть записан только один процесс / поток. Вот почему писатель берет замок.
Ваши параллельные процессы, которые пытаются записать, могут, возможно, проверить исключение org.apache.lucene.store.LockObtainFailedException
при создании экземпляра модуля записи.
Вы можете, например, поместить процесс, который создает экземпляр writer2
, в цикл ожидания, чтобы дождаться завершения активного процесса записи и выдать writer1.close();
, который затем снимет блокировку и сделает индекс Lucene доступным для записи снова. В качестве альтернативы, вы можете одновременно записать несколько индексов Lucene (в разных местах), и при выполнении поиска вам нужно будет выполнить поиск по всем из них.
* "Для принудительного применения одного средства записи за раз, что означает, что IndexWriter или IndexReader выполняют удаление или изменяют нормы, Lucene использует блокировку на основе файлов: если существует файл блокировки (write.lock по умолчанию) в вашей директории индекса у писателя в настоящее время открыт индекс. Любая попытка создать другую запись по тому же индексу приведет к возникновению исключения LockObtainFailedException. Это жизненно важный механизм защиты, потому что если два автора случайно создаются по одному индексу, это очень быстро привести к повреждению индекса. "
Раздел 2.11.3, Lucene в действии , второе издание, Майкл МакКэндлесс, Эрик Хэтчер и Отис Господнетич, 2010