session.clear()如何在Hibernate中工作

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视为自已启动当前事务以来已从(或持久保存)数据库加载的实体的缓存.

  1. Session.clear以任何方式都不是强制性的,但如果您在一个事务中执行大量实体加载/保存,则有用,以避免出现内存不足错误.在您的示例中,您将employee在会话中复制50个实体.如果没有flushclear方法调用每50个,save()你就会在会话中复制100.000个实体(而不是垃圾收集,因为会话有一个指向实体的链接).

  2. Session.clear不会执行提交或回滚.甚至不是flush(因此为什么你应该在a之前进行刷新Session.clear,以便hibernate为未决实体更新生成sql查询.

  3. 回滚或提交操作不是在应用程序端执行,而是在数据库中执行:hibernate只会要求数据库提交或回滚(Hibernate可能会在提交操作之前触发刷新,但刷新不是提交的一部分).提交操作不会(也不能)访问会话.它是一种数据库内部机制,由于自事务开始以来运行的所有SQL查询,它将持久(或恢复)执行的数据修改.

完全以同样的方式,在hibernate中打开一个事务并没有执行很多事情:主要是从池中获取数据库连接,并告诉数据库 auto_commit遵循sql查询但是等待提交或回滚命令.