我有 7 个实体类要使用 Hibernate Search 进行索引。在尝试了 MassIndexer 和 FlushToIndexes 之后,索引器进程通过最小的实体搅动,但最大的实体/表没有完成,即使 MassIndexerProgressMonitor 告诉索引已完成。该进程仅在达到分配的 100-200 MB 时挂起。我想确保索引过程正确结束。
问题:代码是否正确?应该调整休眠或数据库设置吗?
环境:64 位 Windows 7、JBoss、Struts2、Hibernate、Hibernate Search、Lucene、SQL Server。休眠搜索索引放置在文件系统中。
MassIndexer 代码示例:
final Session session = HibernateSessionFactory.getSession();
final FullTextSession fullTextSession = Search.getFullTextSession(session);
MassIndexerProgressMonitor monitor = new IndexProgressMonitor("Kanalregister");
fullTextSession.createIndexer()
.purgeAllOnStart(true)
.progressMonitor(monitor)
.batchSizeToLoadObjects(BATCH_SIZE) // 250000
.startAndWait();
FlushToIndexes 代码示例:(来自 Hibernate ref. doc。)(似乎可以索引,但永远不会结束)
final Session session = HibernateSessionFactory.getSession();
final FullTextSession fullTextSession = Search.getFullTextSession(session);
fullTextSession.setFlushMode(FlushMode.MANUAL);
fullTextSession.setCacheMode(CacheMode.IGNORE);
Transaction t1 = fullTextSession.beginTransaction();
// Scrollable results will avoid loading too many objects in memory
ScrollableResults results = fullTextSession.createCriteria(Land.class)
.setFetchSize(BATCH_SIZE) // 250000
.scroll(ScrollMode.FORWARD_ONLY);
int index = 0;
while (results.next()) {
index++;
fullTextSession.index(results.get(0)); // index each element
if (index % BATCH_SIZE == 0) {
fullTextSession.flushToIndexes(); // apply changes to indexes
fullTextSession.clear(); // free memory since the queue is processed
}
}
t1.commit();
使用 hibernate.cfg.xml 中的以下设置验证代码在模拟所有索引工作时结束:
<property name="hibernate.search.default.worker.backend">blackhole</property>