关于Hibernate session.flush()的问题

Mah*_*leh 28 java orm 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();
}
Run Code Online (Sandbox Code Playgroud)

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

有人可以向我解释当条件成立时会发生什么.

Pas*_*ent 51

来自javadoc Session#flush:

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

刷新是将底层持久存储与内存中保持的可持久状态同步的过程.

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

但是,新的Car实例仍将保存在会话级缓存中,而对于大型实例myList.size(),您将会占用所有内存并最终得到一个OutOfMemoryException.为了避免这种情况,文档中描述的模式是定期对flush AND clear会话(与JDBC批处理大小相同)继续更改,然后分离实例以便可以对它们进行垃圾回收:

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();
Run Code Online (Sandbox Code Playgroud)

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

也可以看看