为什么在Hibernate中需要使用flush操作?

4
我最近开始使用hibernate 3.x,对于“刷新会话强制Hibernate将Session的内存状态与数据库同步”的说明感到困惑。
请帮我理解以下几点:
  1. 刷新会话是什么意思?它会将查询(例如插入语句)执行并将数据保存到表中,但我们在其他会话中看不到这些数据吗?
  2. 刷新后,这些数据会存储在会话对象中还是数据库表中?
  3. 如果发生异常情况,该怎么办?
请通过示例帮助我理解刷新的工作原理。
1个回答

7
强制会话刷新。它用于将会话数据与数据库同步。 当您调用session.flush()时,语句在数据库中被执行,但不会被提交。
如果您不调用session.flush()并且调用session.commit(),则内部commit()方法会执行语句并提交。
所以,commit()=flush+commit
所以,seesion.flush()只是在数据库中执行语句(但不提交),语句不再在内存中了。它只是强制会话刷新。
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

您可以查看有关清除缓冲区的帖子。


为什么我们不能直接提交,暂时忘记“commit=flush+commit”这个语句。想象一下如果没有flush会有什么不利影响,那我直接提交会有什么缺点。 - CoreThought
考虑这样一种情况:在会话中有10,000个插入语句,而您的内存大小非常低。如果您刷新记录,则插入语句将在数据库上执行,但是只要您未提交操作,数据就不会在数据库上反映出来。现在,您想回滚这些插入语句,因为我们尚未提交操作。我们通常将10,000条记录转换为1,000条记录的10组,因为我们没有巨大的内存来存储这些记录会话中。 - Abhijeet
如果我们执行了该操作,那么就无法回滚。 - Abhijeet
这意味着在刷新后,如果我回滚事务,然后提交事务。数据将不会保存在数据库中。 - CoreThought
@Monica 刷新后,数据将从内存中清除。 - Abhijeet
显示剩余8条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接