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

标签 hibernate session

我引用了很多文章,但我仍然不清楚 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 中复制的实体。没有 flushclear每 50 个方法调用一次 save()您将在 session 中复制 100.000 个实体(而不是垃圾回收,因为 session 具有到实体的链接)。
  • Session.clear不会执行提交或回滚。甚至没有 flush (因此为什么你应该在 Session.clear 之前进行刷新,以便 hibernate 为挂起的实体更新生成 sql 查询。
  • 回滚或提交操作不是在应用程序端执行,而是在数据库中执行:hibernate 只会要求数据库提交或回滚(Hibernate 可能会在提交操作之前触发刷新,但刷新不是提交的一部分)。提交操作不会(也不能)访问 session 。它是一种数据库内部机制,它将保留(或恢复)由于自事务开始以来运行的所有 SQL 查询而执行的数据修改。

  • 完全一样,在hibernate中打开一个事务并没有做很多事情:主要是从池中获取一个db连接,并告诉数据库NOT auto_commit遵循 sql 查询但等待提交或回滚命令。

    关于hibernate - session.clear() 如何在 Hibernate 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42969763/

    相关文章:

    session - tomcat集群是 session 复制的唯一方式吗?

    python - django 的登录 session

    hibernate - Grails 2.4.4中的Hibernate JPA冲突

    java - 为什么 JPA/Hibernate 事务处于 Activity 状态,即使我没有显式启动事务

    php - 通过 PHP 和 MySQL 插入 ID

    javascript - 基于Tab切换的页面刷新

    java - 如何防止 JPA 实体出现 ClassCastException?

    hibernate - 在 JBoss 上部署 Hibernate 应用程序时出错 - 找不到适用于 jdbc 的驱动程序

    Spring Data Jpa - 当 @transactional 存在时存储库不会引发异常

    java - 无限 session 对象导致 RAM 已满