У меня есть 7 классов сущностей для индексации с помощью Hibernate Search. Попробовав и MassIndexer, и FlushToIndexes, процесс индексатора перебрал самые маленькие объекты, но самые большие объекты / таблицы не завершились, хотя MassIndexerProgressMonitor сообщил, что индексирование завершено. Процесс просто зависает, когда он достигает выделенных 100-200 МБ. Я хочу, чтобы процесс индексации завершился правильно.
Вопросы: правильный ли код? Следует ли настраивать параметры гибернации или базы данных?
Среда: 64-битная Windows 7, JBoss, Struts2, Hibernate, Hibernate Search, Lucene, SQL Server. Индекс поиска 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: (из справочного документа Hibernate) (похоже, индекс в порядке, но никогда не заканчивается)
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>