Hibernate搜索lucene消耗数据库连接
Hibernate search lucene consuming database connections
我已经为 c3p0 池配置了 maxPoolSize 10。 minPoolSize 为 3。
每当我启动服务器并为 mysql 数据库执行 show processlist 时,都会建立三个连接。除非服务器流量很大,否则这将只保留三个。这个不错。
我实现了搜索功能,这是第一次启动索引。
当应用程序进行搜索时,当我检查我的数据库的显示进程列表时,所有的数据库连接现在都打开了。我看到所有 10 个连接都已打开。
这是公认的行为吗?理想情况下,我会说利用打开 2 或 3 个连接可能没问题。
为什么 hibernate lucene 使用了很多连接?
我可以在某处为 lucene 配置最大连接数吗?
我在下面发布我的代码。
fullTextEntityManager.createIndexer().startAndWait();
将只为应用程序执行一次
@Transactional
public List<E> searchRecord(String searchText) {
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
if (CREATE_INDEX.equals("START")) {
try {
log.info("creating indexes");
fullTextEntityManager.createIndexer().startAndWait();
CREATE_INDEX = "END";
} catch (InterruptedException e) {
log.info("error in creating indexes", e);
}
}
log.info("lucene query builder");
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(getEntityClass())
.get();
// org.apache.lucene.search.Query luceneQuery =
// qb.keyword().onFields("name")
// .matching(searchText).createQuery();
if(searchText.contains(" ")){
String[] splittedText = searchText.split(" ");
searchText = splittedText[0];
}
org.apache.lucene.search.Query luceneQuery = qb.keyword().wildcard().onField(getSearchField())
.matching(searchText.toLowerCase() + '*').createQuery();
javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, getEntityClass());
List<E> result = jpaQuery.getResultList();
return result;
}
海量索引器的目的是处理您的整个数据库(或至少是应该被 Hibernate Search 索引的部分)以重建索引。如您所料,这是一个高度资源密集型过程,需要大量数据库访问,并行执行这些访问可以显着加快该过程。这就是它使用许多连接的原因;默认情况下它使用 7 个连接。
现在,如果您希望质量索引器使用更少的连接,您可以简单地要求质量索引器使用更少的线程:
fullTextEntityManager.createIndexer()
.threadsToLoadObjects(2)
.startAndWait();
以上将只使用 3 个线程:2 个从数据库加载实体,1 个将文档推送到索引。不过,显然重建索引会更慢。
有关此主题的详细信息,请参阅 this section of the documentation。
我已经为 c3p0 池配置了 maxPoolSize 10。 minPoolSize 为 3。 每当我启动服务器并为 mysql 数据库执行 show processlist 时,都会建立三个连接。除非服务器流量很大,否则这将只保留三个。这个不错。
我实现了搜索功能,这是第一次启动索引。 当应用程序进行搜索时,当我检查我的数据库的显示进程列表时,所有的数据库连接现在都打开了。我看到所有 10 个连接都已打开。 这是公认的行为吗?理想情况下,我会说利用打开 2 或 3 个连接可能没问题。 为什么 hibernate lucene 使用了很多连接? 我可以在某处为 lucene 配置最大连接数吗?
我在下面发布我的代码。
fullTextEntityManager.createIndexer().startAndWait();
将只为应用程序执行一次
@Transactional
public List<E> searchRecord(String searchText) {
FullTextEntityManager fullTextEntityManager = org.hibernate.search.jpa.Search.getFullTextEntityManager(em);
if (CREATE_INDEX.equals("START")) {
try {
log.info("creating indexes");
fullTextEntityManager.createIndexer().startAndWait();
CREATE_INDEX = "END";
} catch (InterruptedException e) {
log.info("error in creating indexes", e);
}
}
log.info("lucene query builder");
QueryBuilder qb = fullTextEntityManager.getSearchFactory().buildQueryBuilder().forEntity(getEntityClass())
.get();
// org.apache.lucene.search.Query luceneQuery =
// qb.keyword().onFields("name")
// .matching(searchText).createQuery();
if(searchText.contains(" ")){
String[] splittedText = searchText.split(" ");
searchText = splittedText[0];
}
org.apache.lucene.search.Query luceneQuery = qb.keyword().wildcard().onField(getSearchField())
.matching(searchText.toLowerCase() + '*').createQuery();
javax.persistence.Query jpaQuery = fullTextEntityManager.createFullTextQuery(luceneQuery, getEntityClass());
List<E> result = jpaQuery.getResultList();
return result;
}
海量索引器的目的是处理您的整个数据库(或至少是应该被 Hibernate Search 索引的部分)以重建索引。如您所料,这是一个高度资源密集型过程,需要大量数据库访问,并行执行这些访问可以显着加快该过程。这就是它使用许多连接的原因;默认情况下它使用 7 个连接。
现在,如果您希望质量索引器使用更少的连接,您可以简单地要求质量索引器使用更少的线程:
fullTextEntityManager.createIndexer()
.threadsToLoadObjects(2)
.startAndWait();
以上将只使用 3 个线程:2 个从数据库加载实体,1 个将文档推送到索引。不过,显然重建索引会更慢。
有关此主题的详细信息,请参阅 this section of the documentation。