gpt4 book ai didi

java - session.flush 在这里如何帮助释放内存?

转载 作者:搜寻专家 更新时间:2023-10-30 19:50:55 25 4
gpt4 key购买 nike

flush docs 中所述Java

Flushing is the process of synchronizing the underlying persistent store with persistable state held in memory.

以上是我的理解

So if somebody is doing insert/update and then flush, that extra inserted rows will be lying in java memory only. But other way around i.e Db data will only be synchronized with persistable state held in memory on commit only.

现在让我们通过上面的理解

我遇到了 HIbernate commit() and flush()接受的答案告诉我们session.flush 在某些情况下有助于释放内存,从而避免 OutOfMemoryException。

当我执行以下操作时,第 1 行 (session.flush()) 将为客户表上的 20 个客户执行插入查询释放列表中 20 个客户对象的内存,但另一方面创建 20 个客户数据行在仍然在 java 内存中的客户表下(它只会在第 2 行提交时进入数据库)。所以我不确定session.flush 如何帮助释放内存?

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();


for ( int i=0; i<100000; i++ ) {
Customer customer = new Customer(.....);
session.save(customer);
if ( i % 20 == 0 ) { //20, same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush(); //line1
session.clear();
}
}

tx.commit();// line2
session.close();

最佳答案

根据 API session.flush()

void flush()
throws HibernateException

Force this session to flush. Must be called at the end of a unit of work, before committing the transaction and closing the session (depending on flush-mode, Transaction.commit() calls this method).

Flushing is the process of synchronizing the underlying persistent store with persistable state held in memory.

所以此方法的目的是将您的持久状态与底层数据库同步。如果您仍有对对象的引用,这对释放内存没有帮助。

另请引用此链接 - Hibernate out of memory exception while processing large collection of elements

在您的程序中,您正在 for-loop 中创建 100000 Customer。如果没有 hibernate 代码,则意味着您没有维护这些对象的任何引用,因此它们有资格进行垃圾回收。

但是当你说 session.save(customer) 时,对象与 Hibernate 的 session 相关联,因此它们将被放置在一级缓存中。

如果对象数量增加并且没有足够的内存可用,那么您将遇到内存不足的问题,因为 hibernate 会尝试在内存中维护所有这些对象。因此调用flush方法将使 hibernate 调用所需的数据库查询,调用clear将帮助它释放一级缓存中的内存,从而释放一些内存。

更新:

调用session.clear()让hibernate清除内部以一级缓存形式维护的内存。 session.clear() 调用 StatefulPersistenceContext.clear()它在哪里调用 clear() method on various Map's和其他物体。这会清除一级缓存中的内存。这清楚地表明对象有资格进行有助于释放一些内存的垃圾收集。因此状态不再由 Hibernate 维护,因此对象处于分离状态。

现在根据 API Traansaction.commit(); :

void commit()
throws HibernateException

Flush the associated Session and end the unit of work (unless we are in FlushMode.MANUAL.

This method will commit the underlying transaction if and only if the underlying transaction was initiated by this object.

调用 commit() 会刷新所有未决项,然后向基础数据库发出 commit

更新:

另请参阅此链接 - Flushing the session ,它清楚地表明当我们调用 flush() 方法时会进行 JDBC 调用。

Sometimes the Session will execute the SQL statements needed to synchronize the JDBC connection's state with the state of objects held in memory. This process, called flush.

Except when you explicitly flush(), there are absolutely no guarantees about when the Session executes the JDBC calls, only the order in which they are executed.

关于java - session.flush 在这里如何帮助释放内存?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25929968/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com