【问题标题】:org.hibernate.HibernateException: Error while indexing in Hibernate Search (before transaction completion)org.hibernate.HibernateException:在 Hibernate Search 中编制索引时出错(在事务完成之前)
【发布时间】:2015-03-02 20:22:25
【问题描述】:

在我的批处理事务中与休眠一起使用 session.clear() 时,我收到以下错误。

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();一切正常。任何想法为什么我不能在我的批处理事务中使用 clear 和休眠搜索?

【问题讨论】:

    标签: java hibernate hibernate-search


    【解决方案1】:

    Session#flush() 方法将更改刷新到数据库。 通过使用FullTextSession#flushToIndexes() 刷新对 Hibernate Search 管理的索引的更改。

    如果你需要clear()你的会话,你应该刷新这两个,否则一些实体仍然会被排入索引队列但不再被管理,这是一个问题。

    当您刷新到数据库时,Hibernate Search 不会自动刷新到索引,因为在您中止事务的情况下不会撤消对索引的刷新,因此最好明确决定哪一个(或两者)您希望发生的冲洗次数。

    【讨论】:

    • 正是我正在寻找的答案,非常感谢。
    【解决方案2】:

    嗯,您对session.clear(); 的调用在for 循环中。如果要关闭会话,请在循环结束后执行。

    【讨论】:

    • 这对我来说并不完全有意义,如果您不在 for 循环中调用 session.clear,您将面临内存不足异常的风险。 Session.clear() 应该只是清除 L1 缓存,而不是关闭会话吧?我有其他应用程序,我在其中做同样的事情,我没有问题。我唯一能想到的可能是延迟加载的关系表可能是罪魁祸首?批量插入示例stackoverflow.com/questions/3788048/…
    • 那么您是否尝试过使用事务进行更新操作?
    • 是的,这是由框架会话管理器tapestry.apache.org/5.3/apidocs/org/apache/tapestry5/hibernate/…处理的
    猜你喜欢
    • 1970-01-01
    • 2012-11-24
    • 2019-02-25
    • 1970-01-01
    • 2021-02-15
    • 1970-01-01
    • 2017-06-15
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多