J'utilise une application qui utilise la recherche hibernate pour rechercher des personnes dans le système. Je l'ai exécuté sur JBoss AS 7.1.1 et l'application est basée sur Seam 3, Weld et JSF 2.1. Cela fonctionne bien, mais après une charge plus élevée, il s'avère que les pages qui utilisent le FullTextEntityManager
sont chargées très lentement. Et dans quelques instants, toute l'application ralentit.Hibernate Rechercher sur JBoss 7.1.1 Final, Weld et Seam 3
Alors j'ai pensé que peut-être j'utilise mal Hibernate search. J'utilise une start-up singleton pour indexer la base de données:
@Singleton
@Startup
public class Initializer implements Serializable {
private static final long serialVersionUID = 1L;
@PersistenceContext
private EntityManager entityManager;
@PostConstruct
public void startup() throws Exception {
FullTextEntityManager fullTextEntityManager = Search.getFullTextEntityManager(entityManager);
fullTextEntityManager.createIndexer().startAndWait();
}
}
Et puis-je utiliser le FullTextEntityManager
dans la méthode qui est utilisée dans un composant autocomplete de PrimeFaces:
@Session Scoped
public class ... {
private QueryBuilder queryBuilder;
@Inject
private EntityManager entityManager;
@PostConstruct
public void initFulltext() {
fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(entityManager);
queryBuilder = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(Person.class).get();
}
@Override
@SuppressWarnings("unchecked")
public List<Person> autocomplete(Object event) throws Exception {
if (event.toString() != null && !event.toString().trim().isEmpty()) {
org.apache.lucene.search.Query query = queryBuilder.keyword()
.onFields("username", "firstname", "lastname").matching(event.toString())
.createQuery();
FullTextQuery persistenceQuery = fullTextEntityManager.createFullTextQuery(query, Person.class);
persistenceQuery.setMaxResults(MAX_RESULTS_ON_PAGE);
return persistenceQuery.getResultList();
}
return null;
}
}
Est-ce un bon usage de Hibernate Search dans une application Java EE? N'est-il pas possible qu'après un certain temps, la recherche hibernate tente de synchroniser les changements d'entités et l'index Lucene? Si oui, est-il possible que cela ait un impact énorme sur la performance?
Cela semble juste. Je vais faire quelques tests. Merci pour référence. – lukas
Oui, il n'y a pas de moyen de le faire. Varie d'une requête à l'autre. Heureux d'aider. Cordialement –
@lukas, curieux de savoir si vous avez résolu votre problème? et comment? –