我引用了很多文章,但我仍然不清楚 session.clear
是什么在 hibernate 状态下执行。
根据我目前遇到的情况是,
当我们使用批量保存/更新时如下图:
Session session = SessionFactory.openSession();
Transaction tx = session.beginTransaction();
for ( int i=0; i<100000; i++ ) {
Employee employee = new Employee(.....);
session.save(employee);
if( i % 50 == 0 ) { // Same as the JDBC batch size
//flush a batch of inserts and release memory:
session.flush();
session.clear();
}
}
tx.commit();
session.close();
sesion.flush();
用于刷新 session 强制 Hibernate 将 Session 的内存状态与数据库同步。问题
1. 刷新 session 后,为什么要做
session.clear()
?真的需要吗?2. 将
session.clear()
执行提交操作?3. 如果
session.clear()
驱逐所有加载的对象,执行提交和回滚操作时内部会发生什么?
最佳答案
将 Session 视为自从您启动当前事务以来已经从数据库加载(或持久保存到)数据库的实体的缓存。
Session.clear
无论如何都不是强制性的,但如果您在一个事务中执行大量实体加载/保存,以避免出现内存不足错误,则很有用。在您的示例中,您将拥有 50 employee
在 session 中复制的实体。没有 flush
和 clear
每 50 个方法调用一次 save()
您将在 session 中复制 100.000 个实体(而不是垃圾回收,因为 session 具有到实体的链接)。 Session.clear
不会执行提交或回滚。甚至没有 flush
(因此为什么你应该在 Session.clear
之前进行刷新,以便 hibernate 为挂起的实体更新生成 sql 查询。完全一样,在hibernate中打开一个事务并没有做很多事情:主要是从池中获取一个db连接,并告诉数据库NOT
auto_commit
遵循 sql 查询但等待提交或回滚命令。
关于hibernate - session.clear() 如何在 Hibernate 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42969763/