Изпълнявам приложение, което използва търсене в хибернация за търсене на хора в системата. Пускам го на JBoss AS 7.1.1 и приложението е базирано на Seam 3, Weld и JSF 2.1. Работи гладко, но след малко по-голямо натоварване се оказва, че страниците, които използват FullTextEntityManager
, се зареждат много бавно. И в някои моменти цялото приложение се забавя.
Така че ми хрумна, че може би използвам търсенето в Hibernate неправилно. Използвам стартиращ сингълтон за индексиране на базата данни:
@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();
}
}
След това използвам FullTextEntityManager
в метода, който се използва в компонент за автоматично довършване на 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;
}
}
Това правилно ли е използването на Hibernate Search в приложение на Java EE? Не е ли възможно след известно време търсенето в хибернация да се опитва да синхронизира промените на обекти и индекса Lucene? Ако е така, възможно ли е това да има огромно влияние върху производителността?