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

关于Hibernate session.flush()的问题

潘星阑
2023-03-14
问题内容

我想查询在以下情况下flush方法的实际作用:

for (int i = 0; i < myList.size(); i++) {
    Car c = new Car( car.get(i).getId(),car.get(i).getName() );
    getCurrentSession().save(c);
    if (i % 20 == 0)
        getCurrentSession().flush();
}

这是否意味着在迭代20之后,将刷新高速缓存,然后将这20个保留的内存对象实际保存在数据库中?

有人可以告诉我当条件为真时会发生什么。


问题答案:

来自的javadoc
Session#flush

强制刷新该会话。必须在提交事务并关闭会话之前在工作单元的末尾调用(取决于 flush-
mode
,Transaction.commit()
调用此方法)。

刷新 是将基础持久性存储与内存中保持的可持久状态进行同步的过程。

换句话说,flush告诉Hibernate执行将JDBC连接状态与会话级缓存中保存的对象状态同步所需的SQL语句。条件if (i % 20 == 0)将使它每i20的倍数发生一次。

但是,新Car实例仍将保留在会话级缓存中,并且,大的话myList.size(),您将吃光所有内存并最终获得OutOfMemoryException。为了避免这种情况,文档中描述的模式是按固定的时间间隔(与JDBC批处理大小相同)对会话进行flush
AND操作 clear,以保留更改,然后分离实例,以便可以对其进行垃圾回收:

13.1。批量插入

在使新对象持久化flush()然后定期清除()时,会话将html" target="_blank">控制一级缓存的大小。

Session session = sessionFactory.openSession();
Transaction tx = session.beginTransaction();

for ( int i=0; i<100000; i++ ) {
    Customer customer = new Customer(.....);
    session.save(customer);
    if ( i % 20 == 0 ) { //20, same as the JDBC batch size
        //flush a batch of inserts and release memory:
        session.flush();
        session.clear();
    }
}

tx.commit();
session.close();

该文档在同一章中提到了如何设置JDBC批处理大小。

也可以看看

  • 10.10。冲洗会议
  • 第13章批处理


 类似资料:
  • 问题内容: 常量INADDR_ANY是所谓的IPv4通配符地址。通配符IP地址对于在多宿主主机上绑定Internet域套接字的应用程序很有用。如果多宿主主机上的应用程序将套接字仅绑定到其主机的IP地址之一,则该套接字只能接收发送到该IP地址的UDP数据报或TCP连接请求。但是,我们通常希望多宿主主机上的应用程序能够接收指定主机IP地址的数据报或连接请求,并将套接字绑定到通配符IP地址可以实现这一点

  • 有时我们会遇到几个关于Autoconf的问题。下面是被提及的一些问题。 发布configure脚本 对发行由Autoconf生成的configure有什么限制?它们是如何影响我那些使用它们的程序的? 关于由Autoconf生成的配置脚本是如何发行和如何被使用的,并没有限制。在Autoconf第1版中,它们是服从GNU通用公共许可证的。 我们仍然鼓励软件的作者按照诸如GPL的条款发行他们的作品,但A

  • 过去几天我一直在使用java,最近几天我收到了一个问题表单。当我试图在servlet中创建一个类时,包部分显示以下错误"** > 无法解析ObjectInputStreamjava.io.类型。它是从必需的. class文件间接引用的 当我试着评论出 导入javax.servlet.http.HttpServlet; **"部分的错误是去,但我不能扩展的http的servlet类。 此图像显示错误

  • 我们基本上是在使用这里记录的Git流:http://nvie.com/posts/a-successful-git-branching-model/.现在开发人员提出了一些问题: 我们从哪里发布代码到生产?发布/修补程序分支还是主分支 我还有更多问题: 如果发布分支没有变化,为什么我们甚至需要一个?我来自ClearCase世界,我总是有这样的印象,如果没有变化,分支就不需要了。 为什么Git不经常

  • 我需要你的帮助我是一个begineer在Spring启动,所以我有一个问题在Spring启动分页 存储库:

  • 想改进这个问题吗?更新问题,使其仅通过编辑这篇文章来关注一个问题。 刚开始学习java大约一个月,我对arraylist和oop有几个问题 这个arraylist允许我将字符串添加到列表中并存储它,但是如果我有一个类调用簿呢 这三者有什么区别?假设我有大量的输入,比如文件 我有一个班级运动 我该怎么做呢?所以我用许多参数来添加这些输入,因为如果我想添加,我通常会这样做 我也会去