2012-09-26 7 views
4

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?

Répondre

2

C'est l'utilisation correcte de la recherche d'hibernation je dirais. C'est le cache de terrain qui dégrade les performances pour vous. C'est en fait une requête dépendante. Réagir à la section 5.5 here, devrait être d'une certaine aide.

+0

Cela semble juste. Je vais faire quelques tests. Merci pour référence. – lukas

+1

Oui, il n'y a pas de moyen de le faire. Varie d'une requête à l'autre. Heureux d'aider. Cordialement –

+0

@lukas, curieux de savoir si vous avez résolu votre problème? et comment? –