システム内の人を検索するために休止状態の検索を使用するアプリケーションを実行しています。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 インデックスの変更を同期しようとしている可能性はありませんか? もしそうなら、それがパフォーマンスに大きな影響を与える可能性はありますか?