当前位置: 首页 > 面试题库 >

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

何辰沛
2023-03-14
问题内容

我提到了许多文章,但仍然不清楚session.clearhibernate状态下的性能

根据我到目前为止遇到的是,当我们使用批量保存/更新时,如下所示:

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将Session的内存中状态与数据库同步。

1. 刷新会话后,为什么需要这样做session.clear()?真的需要吗?

2.session.clear()执行提交动作吗?

3. 如果session.clear()逐出所有已加载的对象,则在执行提交和回滚操作时内部会发生什么?


问题答案:

可以将会话视为自开始当前事务以来已经从数据库加载(或持久存储到)的实体的缓存。

  1. Session.clear并非以任何方式强制执行,但是如果您在一个事务中执行大量实体加载/保存操作,则很有用,以避免出现内存不足错误。在您的示例中,您将employee在会话中复制50个实体。如果没有flushand clear方法调用,则每50个对象中save()您将有100.000个实体在会话中复制(并且不是垃圾回收的,因为会话具有指向该实体的链接)。

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

  3. 回滚或提交操作不是在应用程序端执行的,而是在数据库中执行:hibernate只会要求数据库进行提交或回滚(Hibernate可能会在提交操作之前触发刷新,但刷新不属于提交的一部分)。提交操作将(也无法)访问会话。这是一种数据库内部机制,由于自事务开始以来运行了所有SQL查询,因此该数据库内部机制将保留(或还原)执行的数据修改。

完全以相同的方式,在hibernate状态下打开事务并没有执行很多操作:主要是从池中获取数据库连接,并告诉数据库 不要
auto_commit遵循sql查询,而是等待提交或回滚命令。



 类似资料:
  • 我从网上和论坛上看到了关于BatchSize的相关主题,但我仍然不明白一些部分。所以让我们描述一下我理解的和不理解的。 批量取数:选择取数的优化策略。Hibernate通过指定主键或外键列表,在一次选择中检索一批实体实例或集合。 让我们有JPA 2.0,带有Hibernate实现。这些实体: } 因此,我懒得去了解产品中的制造商。因此,当我执行select fetching时,就完成了。所以我有很

  • 我正在处理一些旧的应用程序代码,其中似乎涉及到几个概念,因此我希望能够将它们改进为一个坚实而严格的实践。 基本上,整个代码都用这样的HibernateSessionRequest estFilter包装 然后,有一个拦截器,做这样的事情 然后还有更多的业务逻辑代码,包括更多的初始事务和会话清除等。 那么,问题是: 当在同一会话中多次调用beginTransaction时会发生什么 非常感谢。

  • 问题内容: 我正在使用带有Hibernate的MS SQL Server 2008。我的问题是Hibernate如何实现 采取以下简单方案。 如果我有一个返回100行的查询,并且如果我将1传递给,这会影响SQL Server本身返回的结果(就像运行一条语句一样),还是Hibernate首先获取所有结果(在这种情况下为所有100行)并挑选最高的自己? 我问的原因是,当行数开始增加时,它将出现巨大的性

  • 问题内容: 我已经为EHCache配置了defaultCache(用于元素),StandardQueryCache(用于查询)和UpdateTimestampsCache(我认为是为了跟踪数据库更新……但我实际上并没有真正地了解它的功能)。 我已经为每个缓存设置了maxElementsInMemory,但是我没有得到的是这个数字控制StandardQueryCache和UpdateTimestam

  • 本文向大家介绍hibernate 是如何工作的?相关面试题,主要包含被问及hibernate 是如何工作的?时的应答技巧和注意事项,需要的朋友参考一下 读取并解析配置文件。 读取并解析映射文件,创建 SessionFactory。 打开 Session。 创建事务。 进行持久化操作。 提交事务。 关闭 Session。 关闭 SessionFactory。

  • 问题内容: 搜索了几个小时,但我陷入了使用JPA的PlayFramework学习的困境。我正在建立一个示例网站,可以在其中发布帖子。但是这些帖子可以具有以下状态: PostDraft(帖子是草稿,不发布) PostPublished(帖子可以发布) 这些状态存储在单独的表中。显然,州立草稿 尚不可见。 所以我有这些课: 页面类(从表中获取页面信息,一个页面可以有多个帖子) 帖子类(帖子可以在草稿中