2015-03-02 5 views
0

Я получаю следующую ошибку при использовании session.clear() в моей пакетной транзакции с спящим режимом.org.hibernate.HibernateException: ошибка при индексировании в Hibernate Search (до завершения транзакции)

org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion) 

Я использую следующий код

try { 
     for (TimeSheetEntity timeSheet : timeSheets) { 
      timeSheet.setActive(false); 
      try { 
       session.update(timeSheet); 

       count++; 

       if (count % 250 == 0 || totalCount == count) { 
        System.out.println(count); 

        session.flush(); 
        session.clear(); 
       } 
      } catch (HibernateException ex) { 
       logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] "); 
      } catch (Exception ex) { 
       logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex) + "[" + timeSheet.getId() + "] "); 
      } 
     } 

     sessionManager.commit(); 
    } catch (HibernateException ex) { 
     System.out.println(ex); 
     logger.error(ArchiveImpl.class.getName(), ExceptionUtils.getStackTrace(ex)); 
     sessionManager.abort(); 
    } finally { 
    } 

Теперь, если удалить session.clear(); все работает так, как предполагается. Любые идеи, почему я не могу использовать ясность в своей пакетной транзакции с помощью поиска в спящем режиме?

ответ

3

Метод Session#flush() сбрасывает изменения в базу данных. Изменения в индексе, управляемом с помощью Hibernate Search, сбрасываются с помощью FullTextSession#flushToIndexes().

Если вам нужно clear() вашей сессии, вы должны очистить их оба, или некоторые объекты по-прежнему будут выставлены в очередь для индексирования, но больше не будут управляться, что является проблемой.

Hibernate Search не будет автоматически обновляться до индексов, когда вы делаете флеш для базы данных, так как флеш к индексам не будет отменен, если вы прекратите транзакцию, поэтому лучше, если вы решите явно, какой из них (или оба) флешей, которые вы хотите совершить.

+0

Точно ответ, который я искал, отлично работал. –

0

Ну, ваш звонок session.clear(); находится в цикле for. Если вы хотите закрыть сеанс, сделайте это после завершения цикла.

+0

Это не имеет для меня никакого смысла, если вы не вызываете session.clear в цикле for, вы рискуете исключением из памяти. Session.clear() должен просто очистить кеш L1, а не закрывать сессию правильно? У меня есть другие приложения, где я делаю это точно так же, и у меня нет проблем. Единственное, о чем я могу думать, это, возможно, реляционные таблицы, которые лениво загружаются, могут быть виновниками? Пример пакетной вставки http://stackoverflow.com/questions/3788048/safely-clearing-hibernate-session-in-the-middle-of-large-transaction –

+0

Затем вы попытались использовать транзакцию для своих операций обновления? –

+0

Да, это обрабатывается менеджером сеансов фреймворков http://tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/hibernate/HibernateSessionManager.html –

Смежные вопросы