4

我正在运行一个使用休眠搜索在系统中查找人员的应用程序。我在 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;
        }
}

这是在 Java EE 应用程序中正确使用 Hibernate Search 吗?一段时间后,休眠搜索是否可能会尝试同步实体和Lucene索引的更改?如果是这样,它是否可能对性能造成巨大影响?

4

1 回答 1

2

我想说的是休眠搜索的正确用法。它的字段缓存会降低您的性能。这实际上取决于查询。在此处阅读第 5.5 节,应该会有所帮助。

于 2012-09-29T20:25:59.183 回答