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