我有7个实体类可以使用Hibernate Search进行索引。在尝试了MassIndexer和FlushToIndexes之后,索引器进程通过最小的entites流失,但最大的实体/表没有完成,即使MassIndexerProgressMonitor告诉索引完成。当它达到100-200 MB分配时,该过程就会挂起。我想确保索引过程正确结束。
问题:代码是否正确?应该调整休眠或数据库设置吗?
环境:64位Windows 7,JBoss,Struts2,Hibernate,Hibernate Search,Lucene,SQL Server。 Hibernate搜索索引放在文件系统中。
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参考文档)(似乎索引正常,但永远不会结束)
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>
答案 0 :(得分:0)
上述代码经过验证且正确无误。
我的控制台没有结束的问题被认为与Eclipse有关,因为确实显示了main()末尾的打印输出。
有一些缺失的实体类(在我的模型中)没有正确报告。一旦我收到通知并将它们添加到我的模型中,索引过程就成功结束了MassIndexer,lucene索引中每个目录中的3个以上文件都证明了这一点。