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()然后清除()会话时,为了控制第一级缓存的大小.
Run Code Online (Sandbox Code Playgroud)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批处理大小.
| 归档时间: |
|
| 查看次数: |
58802 次 |
| 最近记录: |