Hibernate Search на JBoss 7.1.1 Final, Weld and Seam 3

Изпълнявам приложение, което използва търсене в хибернация за търсене на хора в системата. Пускам го на 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? Ако е така, възможно ли е това да има огромно влияние върху производителността?


person lukas    schedule 26.09.2012    source източник


Отговори (1)


Бих казал, че използването на хибернация за търсене е правилно. Това е полевият кеш, който влошава производителността за вас. Това всъщност зависи от заявката. Прочетете раздел 5.5 тук, трябва да бъде от някаква помощ.

person Mukul Goel    schedule 29.09.2012
comment
да, няма просто някакъв НАЧИН да го направите. Варира от заявка до заявка. Радвам се да помогна. за разбирането - person Mukul Goel; 01.10.2012
comment
@lukas, любопитен да разбереш дали си решил проблема си? и как? - person Mukul Goel; 10.10.2012
comment
Все още имам някои проблеми с производителността, така че не опитах. Ще върна тази функция, след като се уверя, че съм открил причината за проблемите си. Засега изглежда, че търсенето в Hibernate не е причината. Но все още не съм сигурен - person lukas; 12.10.2012