PRA*_*P S 13 session hibernate
我提到了许多文章,但我仍然不清楚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();
Run Code Online (Sandbox Code Playgroud)
sesion.flush(); 用于刷新会话强制Hibernate将Session的内存状态与数据库同步.
题
1.冲洗会议结束后,为什么有必要办session.clear()?真的需要吗?
2.会session.clear()执行提交操作吗?
3.如果session.clear()逐出所有加载的对象,执行提交和回滚操作时内部会发生什么?
Thi*_*rry 21
将Session视为自已启动当前事务以来已从(或持久保存)数据库加载的实体的缓存.
Session.clear以任何方式都不是强制性的,但如果您在一个事务中执行大量实体加载/保存,则有用,以避免出现内存不足错误.在您的示例中,您将employee在会话中复制50个实体.如果没有flush和clear方法调用每50个,save()你就会在会话中复制100.000个实体(而不是垃圾收集,因为会话有一个指向实体的链接).
Session.clear不会执行提交或回滚.甚至不是flush(因此为什么你应该在a之前进行刷新Session.clear,以便hibernate为未决实体更新生成sql查询.
回滚或提交操作不是在应用程序端执行,而是在数据库中执行:hibernate只会要求数据库提交或回滚(Hibernate可能会在提交操作之前触发刷新,但刷新不是提交的一部分).提交操作不会(也不能)访问会话.它是一种数据库内部机制,由于自事务开始以来运行的所有SQL查询,它将持久(或恢复)执行的数据修改.
完全以同样的方式,在hibernate中打开一个事务并没有执行很多事情:主要是从池中获取数据库连接,并告诉数据库不 auto_commit遵循sql查询但是等待提交或回滚命令.
| 归档时间: |
|
| 查看次数: |
11010 次 |
| 最近记录: |