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 に答える