我有7个实体类使用Hibernate Search进行索引。在尝试MassIndexer和FlushToIndexes之后,尽管MassIndexerProgressMonitor告知索引编制已完成,但索引器进程通过最小的实体搅动,但最大的实体/表没有完成。这个过程只会在分配100-200 MB时挂起。我想确保索引过程正常结束。休眠搜索索引器进程在半工作后挂起
问题:代码是否正确?应该调整休眠还是数据库设置?
环境:64位Windows 7,JBoss和Struts2的,休眠,休眠的搜索,Lucene的,SQL服务器。 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代码示例:(。从休眠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();
代码被验证结束时,嘲笑所有索引窝rk,在hibernate.cfg.xml中使用以下设置:
<property name="hibernate.search.default.worker.backend">blackhole</property>
嗨,你能否澄清一下: - 哪个数据库 - 哪些版本 - 这两种方法中的哪一种工作? – Sanne
嗨,我正在使用SQL Server 2008. MassIndexer工作的一半,FlushToIndexes能够建立小表的索引。 (Ops,在尝试更大的表格时,我得到了一些大表格的配置错误,挂起,我会修复) –
你的batch_size非常高:通常它应该是5到100之间;我仍然认为这不能解释问题。你能检查GC活动并发布完整的线程转储吗?这可能更适合Hibernate搜索论坛https://forum.hibernate.org/viewforum.php?f=9 – Sanne