一尘不染

关于Hibernate session.flush()的问题

hibernate

我想查询在以下情况下flush方法的实际作用:

for (int i = 0; i < myList.size(); i++) {
    Car c = new Car( car.get(i).getId(),car.get(i).getName() );
    getCurrentSession().save(c);
    if (i % 20 == 0)
        getCurrentSession().flush();
}

这是否意味着在迭代20之后,将刷新高速缓存,然后将这20个保留的内存对象实际保存在数据库中?

有人可以告诉我当条件为真时会发生什么。


阅读 322

收藏
2020-06-20

共1个答案

一尘不染

来自的javadoc
Session#flush

强制刷新该会话。必须在提交事务并关闭会话之前在工作单元的末尾调用(取决于 flush-
mode
Transaction.commit()
调用此方法)。

刷新 是将基础持久性存储与内存中保持的可持久状态进行同步的过程。

换句话说,flush告诉Hibernate执行将JDBC连接状态与会话级缓存中保存的对象状态同步所需的SQL语句。条件if (i % 20 == 0)将使它每i20的倍数发生一次。

但是,新Car实例仍将保留在会话级缓存中,并且,大的话myList.size(),您将吃光所有内存并最终获得OutOfMemoryException。为了避免这种情况,文档中描述的模式是按固定的时间间隔(与JDBC批处理大小相同)对会话进行flush
AND操作 clear,以保留更改,然后分离实例,以便可以对其进行垃圾回收:

13.1。批量插入

在使新对象持久化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();
        session.clear();
    }
}

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

该文档在同一章中提到了如何设置JDBC批处理大小。

也可以看看

2020-06-20