Проблема с индексированием FullTextEntityManager всех таблиц в БД перед развертыванием файла war - PullRequest
0 голосов
/ 19 февраля 2019

Я использую сложный поиск hibernate в своем коде для поиска совпадений по классу.Чтобы позволить мне достичь этого, я добавил FullTextEntityManager для инициализации при запуске.Теперь мое приложение состоит из больших объектов и записей, что делает процесс индексации ужасно замедляющим развертывание файла war и в большинстве случаев приводящим к превышению времени ожидания соединения с БД при соединении с БД на другом сервере.

/*I have tried using this approach to see if will stop the indexing upon running the project, but the search algorithm never works thereafter because not results was returned*/
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
            fullTextEntityManager.createIndexer().optimizeAfterPurge(true);


//This is the code doing the indexing of the db records before deployment
 public void initializeHibernateSearch() {

        try {
            FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
            fullTextEntityManager.createIndexer().startAndWait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

Пожалуйста, как я могу сделать так, чтобы индексирование происходило только на объекте, для которого я выполняю сопоставление подобия, или, скорее, ускоряю его, чтобы предотвратить ужасную задержку развертывания приложения

1 Ответ

0 голосов
/ 19 февраля 2019

Массовая индексация не должна выполняться часто: вам нужно будет делать это один раз при первом развертывании, а затем каждый раз, когда вы изменяете сопоставление обратно несовместимым способом (добавление новых полей в существующие сущности, изменениеанализатор на поле, ...).Другие развертывания не требуют переиндексации.

Таким образом, вы не должны рассматривать переиндексацию как часть запуска сервера приложений, а скорее как часть процесса развертывания.Как вы могли бы увидеть, например, выполнение ресурсоемкого сценария SQL в вашей базе данных для обновления вашей схемы.

При этом да, массовая индексация может быть продолжительной в зависимости от объема данных, которые необходимо индексировать,Однако это определенно не должно приводить к тайм-аутам соединения с БД.Ключ заключается в правильной настройке переиндексации.

В вашем случае вам следует позаботиться, в частности, об ограничении количества соединений, используемых индексатором массы.В игру вступят две настройки: typesToIndexInParallel и threadsToLoadObjects.

Например:

FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(em);
fullTextEntityManager.createIndexer()
  .typesToIndexInParallel( 2 )
  .threadsToLoadObjects( 5 )
  .startAndWait();

Это указывает массовому индексатору индексировать 2 типа параллельно и использовать 5 параллельныхпотоки для загрузки объектов каждого типа.К этому вы должны добавить один поток для каждого типа, чтобы загрузить идентификаторы объекта.Поскольку каждому потоку требуется одно соединение с базой данных, это означает, что индексатор массы будет использовать 2 * (5 + 1) = 12 соединений.

По умолчанию используется 1 тип параллельно, 6 потоков загрузки, что означает 1 * (6 + 1) = 7 соединений.

Если вам нужно использовать меньше соединений, чтобы другие приложения могли по-прежнему получать доступ к базе данных, либо увеличьте число одновременных соединений, которые принимает БД, до значения, значительно превышающего 7, либо настройте массовый индексатор для использования меньшего количества соединений.Это означает, однако, что массовое индексирование займет больше времени.

Более подробную информацию вы найдете в разделе о массовом индексировании в документации и здесь, в частности, для соединений JDBC..

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