关于Hibernate session.flush()
的问题
我想询问以下情况下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个持有的内存对象实际上保存在数据库中?
有人可以向我解释当条件成立时会发生什么。
没有找到相关结果
已邀请:
4 个回复
抵浮细
的javadoc: 强制此会话刷新。一定是 在工作单元结束时调用, 在提交交易之前 结束会议(取决于 flush-mode,Transaction.commit() 调用这种方法)。 刷新是同步底层的过程 具有持久性的持久存储 国家在记忆中举行。 换句话说,
告诉Hibernate执行将JDBC连接的状态与会话级缓存中保存的对象的状态同步所需的SQL语句。条件
将使每20的
倍数发生。 但是,仍然,新的
实例将保存在会话级缓存中,对于大
,你将吃掉所有内存并最终得到一个
。为了避免这种情况,文档中描述的模式是定期(与JDBC批处理大小相同)对会话进行
ANDѭ9,以持久保存更改,然后分离实例以便可以对它们进行垃圾回收: 13.1。批量插入 使新对象持久化时 flush()然后清除()会话 定期以控制大小 第一级缓存。
该文档在同一章中提到了如何设置JDBC批处理大小。 也可以看看 10.10。刷新会话 第13章批处理
死簇
如果将
设置为FlushMode.Manual,则程序员通知hibernate他/她将处理何时将数据传递给数据库。在此配置下
调用将对象实例保存到数据库。 实际上可以使用
调用来清除持久性上下文。
泉秘胁
关于为什么冲洗应该与批量大小相匹配的几点指针 要启用批处理,您需要设置jdbc批处理大小
使用批处理的一个常见缺陷是,如果您使用单个对象更新或插入,这很好。但以防万一 您正在使用多个对象导致多个插入/更新,那么您将必须显式设置排序机制。 例如
在这种情况下 生成两个sql 1用于插入汽车 1用于插入附件 要进行正确的批处理,您必须设置
所以汽车的所有插件都被整理在一起,并且所有附件的插件都被分类在一起。通过这样做你将有20个插件批量发射而不是一次一个sql发射。 对于一个事务下的不同操作,您可以查看http://docs.jboss.org/hibernate/core/3.2/api/org/hibernate/event/def/AbstractFlushingEventListener.html
览幕堤分