【问题标题】:Why we need flush in hibernate? [duplicate]为什么我们需要在休眠中刷新? [复制]
【发布时间】:2017-01-11 23:50:29
【问题描述】:

我最近开始使用 hibernate 3.x,我对“刷新会话会强制 Hibernate 将 Session 的内存状态与数据库同步”这句话感到困惑。

请帮我理解以下几点-

  1. flush 将 Session 的内存状态与数据库同步 这是什么意思 是指执行了例如插入语句的查询并将数据保存到表中但我们无法看到其中的数据其他会话。

  2. 刷新后,此数据将驻留在会话对象或数据库表本身中的位置。

  3. 万一出现异常情况怎么办。

请通过一个例子帮助我理解flush的工作原理。

【问题讨论】:

    标签: java hibernate session


    【解决方案1】:

    强制会话刷新。它用于将会话数据与数据库同步。 调用 session.flush() 时,语句在数据库中执行,但不会提交。

    如果你不调用 session.flush() 并且如果你调用 session.commit() ,内部 commit() 方法执行语句并提交。

    所以 commit()= flush+commit

    所以 seesion.flush() 只是执行数据库中的语句(但不提交)并且语句不再在内存中。它只是强制会话刷新。

    Flush 主要用于处理成千上万条记录时。 因此,在处理如此数量的记录时,我们使用批量更新和刷新。

    Session session = SessionFactory.openSession();
    Transaction tx = session.beginTransaction();
    for ( int i=0; i<100000; i++ ) {
        Employee emp = new Employee(.....);
        session.save(emp);
    }
    tx.commit();
    session.close();
    

    在上面的例子中,如果你不调用flush,它可能会抛出OutOfMemoryError

    你可以查看这篇关于flushing的帖子

    【讨论】:

    • 为什么不能直接commit 一段时间忘记commit=flush+commit这句话。想象一下图片中根本没有刷新,那么如果我直接提交会有什么缺点。
    • 考虑一个场景,会话中有 10k 个插入语句,并且您的内存大小非常低。在这种情况下,如果您刷新记录,则插入语句将在数据库上执行,但只要您没有提交操作,数据就不会反映在数据库上。现在你想回滚那些插入语句你可以回滚,因为我们没有提交操作。我们一般将10k条记录转换为10组1k条记录,因为我们没有巨大的内存来存储这些记录在会话中
    • 如果我们提交了那个操作,那么我们就不能回滚它。
    • 也就是说flush后如果我回滚事务然后提交事务。数据不会保存在数据库中。
    • @Monica 刷新数据后将从内存中清除
    猜你喜欢
    • 2020-12-03
    • 2011-12-29
    • 2020-09-26
    • 1970-01-01
    • 2020-11-26
    • 2018-11-02
    • 2015-08-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多