我参考了很多文章,但我仍然不清楚什么session.clear
在休眠状态下执行。
据我目前了解到的情况来看,
当我们使用批量保存/更新时如下图:
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();
用于刷新会话,强制 Hibernate 将会话的内存状态与数据库同步。
Question
1.刷新会话后,为什么需要这样做session.clear()
?真的需要吗?
2. Will session.clear()
执行提交操作?
3. If session.clear()
逐出所有加载的对象,执行提交和回滚操作时内部会发生什么?
将会话视为自启动当前事务以来已从数据库加载(或保存到)的实体的缓存。
Session.clear
无论如何都不是强制性的,但如果您在一个事务中进行大量实体加载/保存,以避免出现内存不足错误,则非常有用。在您的示例中,您将有 50employee
会话中复制的实体。如果没有flush
and clear
每 50 次调用一次方法save()
您将在会话中复制 100.000 个实体(并且不可进行垃圾回收,因为会话具有到实体的链接)。
Session.clear
不会执行提交或回滚。甚至没有一个flush
(这就是为什么你应该在Session.clear
,以便 hibernate 为挂起的实体更新生成 sql 查询。
回滚或提交操作不在应用程序端执行,而是在数据库中执行:hibernate只会要求数据库提交或回滚(Hibernate可能会在提交操作之前触发刷新,但刷新不是提交的一部分)。提交操作不会(也不能)访问会话。它是一种数据库内部机制,由于自事务开始以来运行的所有 SQL 查询,该机制将持久(或恢复)所执行的数据修改。
完全相同,在 hibernate 中打开事务并不会执行很多事情:主要是从池中获取数据库连接,并告诉数据库NOT auto_commit
遵循 sql 查询但等待提交或回滚命令。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)