HibernateSearchを使用してインデックスを作成する7つのエンティティクラスがあります。MassIndexerとFlushToIndexesの両方を試した後、MassIndexerProgressMonitorがインデックス作成の終了を通知したにもかかわらず、インデクサープロセスは最小のエンティティを通過しましたが、最大のエンティティ/テーブルは終了しませんでした。割り当てられた100〜200 MBに達すると、プロセスがハングします。インデックス作成プロセスが適切に終了するようにしたい。
質問:コードは正しいですか?休止状態またはデータベース設定を調整する必要がありますか?
環境:64ビットWindows 7、JBoss、Struts2、Hibernate、Hibernate Search、Lucene、SQLServer。HibernateSearchIndexはファイルシステムに配置されます。
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コードサンプル:(Hibernateref。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();
hibernate.cfg.xmlの次の設定を使用して、すべてのインデックス作成作業をモックするときにコードが終了することが確認されます。
<property name="hibernate.search.default.worker.backend">blackhole</property>