2013-01-03 56 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個文件都證明了這一點。