2013-01-03 97 views
0

我有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> 
+0

嗨,你能否澄清一下: - 哪个数据库 - 哪些版本 - 这两种方法中的哪一种工作? – Sanne

+0

嗨,我正在使用SQL Server 2008. MassIndexer工作的一半,FlushToIndexes能够建立小表的索引。 (Ops,在尝试更大的表格时,我得到了一些大表格的配置错误,挂起,我会修复) –

+0

你的batch_size非常高:通常它应该是5到100之间;我仍然认为这不能解释问题。你能检查GC活动并发布完整的线程转储吗?这可能更适合Hibernate搜索论坛https://forum.hibernate.org/viewforum.php?f=9 – Sanne

回答

0

上面的代码经过验证和正确。

我的控制台没有结束的问题被认为与Eclipse相关,因为main()结束时的打印输出确实显示。

有一些遗漏的实体类(在我的模型中)没有正确报告。一旦我得到这些通知并将它们添加到我的模型中,MassIndexer的索引处理就成功结束了,lucene索引中每个目录中的3个文件都证明了这一点。