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

使用StatelessSession进行批处理

杭胜
2023-03-14
问题内容

从文档

如果遇到需要插入1000 000行/对象的情况:

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();

为什么我们应该使用这种方法?与StatelessSession一相比,它给我们带来了什么好处:

    StatelessSession session = sessionFactory.openStatelessSession();
    Transaction tx = session.beginTransaction();

    for ( int i=0; i<100000; i++ ) {
      Customer customer = new Customer(.....);
      session.insert(customer);
    }

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

我的意思是,这个(“替代”)最后一个示例不使用内存,不需要进行同步,清除缓存,那么对于这样的情况,这应该是最佳实践吗?那么为什么要使用前一个呢?


问题答案:

从文档中,您链接到:

特别是,无状态会话不会实现第一级缓存,也不会与任何第二级或查询缓存进行交互。它不实现事务后写或自动脏检查。使用无状态会话执行的操作永远不会级联到关联的实例。无状态会话将忽略集合。通过无状态会话执行的操作会绕过Hibernate的事件模型和拦截器。由于缺少一级缓存,无状态会话很容易受到数据混叠影响。

这些是一些重要的限制!

如果您要创建的对象或所做的修改是对单个对象的标量字段的简单更改,那么我认为与批处理常规会话相比,无状态会话没有任何缺点。但是,一旦您想做一些更复杂的操作(例如,操作一个对象或从第一个对象层叠而来的另一个对象的集合值属性),那么无状态会话将比帮助有所障碍。

更一般地,如果批处理的普通会话所提供的性能足够好,那么无状态会话就是不必要的复杂性。它看起来像普通的会话,但是它具有不同的API和不同的语义,这是引发错误的一种方式。

当然,在某些情况下,它是适当的工具,但我认为这些是例外,而不是规则。



 类似资料:
  • 我正试图弄清楚如何使用Spring Batch进行聚合。例如,我有一个带有姓名列表的CSV文件: 我想要文本文件中的姓名计数: 根据我从Spring Batch中学到的,ETL批处理过程(itemReader- Spring Batch是正确的工具吗?还是我应该用Spark?谢谢

  • 问题内容: 我想知道如何使用MyBatis 3和Spring 3通过我的插入语句实现批处理操作? 例如,这是当前正在执行的操作: spring.xml: MyService.xml: MyService.java: MyController.java: 免责声明:这只是用于演示目的的伪代码 那么我该怎么做才能将其变成批处理流程呢? 理想情况下,我希望能够以最少的“侵入”代码来做到这一点,即更优先使

  • 我正在用Scala编写一个制作人,我想做批处理。批处理的工作方式是,它应该将消息保持在队列中,直到消息已满,然后将所有消息一起发布到主题上。但不知怎么的,它不起作用了。从我开始发送消息的那一刻起,它就开始一个接一个地发布消息。有人知道如何在Kafka Producer中使用批处理吗。

  • 问题内容: 在我的应用程序中,我需要执行很多插入操作。它是一个Java应用程序,我正在使用普通的JDBC执行查询。该数据库是Oracle。我已经启用了批处理,因此它节省了我执行查询所需的网络等待时间。但是查询作为独立的INSERT顺序执行: 我想知道以下形式的INSERT是否可能更有效: 即将多个INSERT折叠成一个。 还有其他使批处理INSERT更快的技巧吗? 问题答案: 这是前两个答案的混合

  • 我已经成功训练了一个超过100000个样本的模型,该模型在训练集和测试集都表现良好。然后,我尝试对一个特定样本(100000个样本中的一个)进行微调,并使用经过训练的权重作为初始化。 但结果有点奇怪,我相信这是由批处理规范化层引起的。具体而言,我的代码可以列出如下: model.load_weights速率=model.evaluate(x, y)打印速率 mymodel是一个自定义函数来生成我的

  • 主要内容:1. 查看正在运行的进程列表,2. 杀死/终止一个进程,3. 启动一个新的过程在本章中,我们将讨论批处理脚本中涉及的各种进程。 1. 查看正在运行的进程列表 在批处理脚本中,可以使用命令来获取系统中当前正在运行的进程的列表。 语法 以下是命令的选项的说明。 /S system - 指定要连接的远程系统。 /U [domain]user - 指定命令应在其下执行的用户上下文。 /P [password] - 指定给定用户上下文的密码。 提示输入,如果省略。 /M [modul