Hibernate поиск lucene потребления базы данных соединений - PullRequest
0 голосов
/ 21 сентября 2018

Я настроил maxPoolSize 10 для пула c3p0.minPoolSize - 3. Каждый раз, когда я запускаю свой сервер и выполняю show processlist для базы данных mysql, устанавливаются три соединения.Это останется только три, если не будет огромный трафик на сервер.Это нормально.

Я реализовал функцию поиска, которая начинает индексирование впервые.Когда приложение выполняет поиск и когда я проверяю show processlist для моей базы данных, все соединения БД открыты.Я вижу, что все 10 соединений открыты.Является ли это принятым поведением.В идеале я бы сказал, что использование открытия 2 или 3 соединений могло бы быть хорошо.Почему спящий люцен использует много соединений?Могу ли я настроить максимальное количество соединений где-нибудь для lucene.

Я публикую свой код ниже.

fullTextEntityManager.createIndexer().startAndWait(); 

будет выполнено только один раз для приложения

    @Transactional
public List<E> searchRecord(String searchText) {

    FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);

    if (CREATE_INDEX.equals("START")) {
        try {
            log.info("creating indexes");
            fullTextEntityManager.createIndexer().startAndWait();
            CREATE_INDEX = "END";
        } catch (InterruptedException e) {
            log.info("error in creating indexes", e);
        }
    }
    log.info("lucene query builder");
    QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(getEntityClass())
            .get();
    // org.apache.lucene.search.Query luceneQuery =
    // qb.keyword().onFields("name")
    // .matching(searchText).createQuery();
    if(searchText.contains(" ")){
        String[] splittedText = searchText.split(" ");
        searchText = splittedText[0];
    }
    org.apache.lucene.search.Query luceneQuery = qb.keyword().wildcard().onField(getSearchField())
            .matching(searchText.toLowerCase() + '*').createQuery();

    javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, getEntityClass());

    List<E> result = jpaQuery.getResultList();
    return result;
}

1 Ответ

0 голосов
/ 24 сентября 2018

Цель массового индексатора - обработать всю базу данных (или, по крайней мере, те части, которые должны быть проиндексированы с помощью Hibernate Search), чтобы перестроить индекс.Как вы можете ожидать, это очень ресурсоемкий процесс, требующий большого количества обращений к базе данных, и параллельное выполнение этих обращений может значительно ускорить процесс.Вот почему он использует много связей;по умолчанию он использует 7 соединений.

Теперь, если вы хотите, чтобы индексатор массы использовал меньше соединений, вы можете просто попросить индексатор массы использовать меньше потоков:

fullTextEntityManager.createIndexer()
    .threadsToLoadObjects(2)
    .startAndWait();

.используйте только 3 потока: 2 для загрузки объектов из базы данных и 1 для отправки документов в индекс.Очевидно, что переиндексация будет медленнее.

См. этот раздел документации для получения дополнительной информации по этой теме.

...