0

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>
4

1 に答える 1

0

上記のコードは検証済みで正しいものです。

main() の最後に出力が実際に表示されたため、コンソールが終了しないという私の問題はEclipseに関連していると考えられます。

(私のモデルでは) 適切に報告されなかったいくつかの欠落したエンティティ クラスがありました。それらの通知を受け取ってモデルに追加すると、MassIndexer のインデックス作成プロセスが正常に終了しました。これは、lucene インデックスの各ディレクトリに 3 つ以上のファイルがあることからもわかります。

于 2013-01-03T14:22:45.333 に答える