当前位置: 首页 > 知识库问答 >
问题:

Spring boot hibernate/jpa批量更新不工作

蒲曦
2023-03-14

应用程序属性

spring.datasource.url=jdbc:as400://localhost/

spring.jpa.properties.hibernate.jdbc.batch_size = 30
spring.jpa.properties.hibernate.order_updates = true
spring.jpa.properties.hibernate.batch_versioned_data = true

实体-

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@Entity(name = "entity")
public class MyEntity {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "ID", nullable = false);

   @ManyToOne
   @JoinColumn(name = "HDR_ID", referencedColumnName = "HDR_ID")
   @JsonIgnore
   private Header header;

   @ManyToOne
   @JoinColumn(name = "STS_ID", referencedColumnName = "STS_ID")
   private Status status;
}

服务-

this.myRepository.saveAll(MyEntitylist);

Gradle-

    implementation 'org.springframework.boot:spring-boot-starter-actuator'
    implementation 'org.springframework.boot:spring-boot-starter-data-jpa'
    implementation 'org.springframework.boot:spring-boot-starter-data-elasticsearch'
    implementation 'org.springframework.boot:spring-boot-starter-web'

我使用的是Spring boot 2.3.5。释放我正在尝试使用hibernate批处理更新批量记录,但它似乎不起作用。我没有收到任何错误,数据库中的记录正在更新,没有任何问题,但性能没有提高。事实上,无论是否使用Hibernate批处理,我都找不到任何区别。我检查了日志,他们的查询记录了每一条记录,例如,如果我试图保存1000条记录,那么日志中将有1000条更新查询。

我预计批处理后更新查询会更少,这取决于批处理的大小,与没有批处理查询相比,它所需的时间应该相对较少。

我的代码中是否有任何配置问题?是否有任何选项,例如reWriteBatchedInserts for jdbc: as400来显示多行插入查询?

共有2个答案

陈项禹
2023-03-14

如果使用标识生成器,Hibernate将在JDBC级别透明地禁用插入批处理。

https://docs.jboss.org/hibernate/core/4.3/devguide/en-US/html_single/#batch

丁长卿
2023-03-14

仅仅因为您在数据库日志中看到了查询,并不意味着批处理不起作用。JDBC批处理是一种协议级优化,依赖于驱动程序支持。JDBC驱动程序可以通过发出单独的语句来实现这一点。不过,优化通常来自重用同一个服务器句柄,并批量发送值。不过,对于1000个元素来说,增益可能太小了。如果看不到任何改进,您应该咨询驱动程序供应商。但是,您没有显示记录了什么类型的查询,您确定在update语句之间没有执行其他语句吗?

 类似资料:
  • 一、简介 方便用户在设置URL规则时更新url,无需手动去更新各页面URL。只需选择就能批量更新URL即可。 二、功能演示 1.批量更新URL 1、仅当内容页URL规则发上变化时,请批量更新,地址未改变时,不需要更新 。 2、规则设置:设置 > 相关设置 > 管理栏目 > 添加或修改栏目 选择需要更新的模型和栏目,输入每轮更新的信息数目提交则完成批量更新URL操作。如下图所示:

  • 一、简介 主要用来操作黄页模块的相关更新操作 ! 1、仅当启用、关闭伪静态时,请批量更新所有链接地址,除此,不需要更新 。 2、启用伪静态在模块配置里。 3、更新企业URL,只需选中企业库模型即可,不必选分类。 二、功能演示

  • 问题内容: 有没有办法在续集中进行批量追加。另外,我可以指定用于检查重复项的键吗? 我尝试了以下操作,但没有成功: 批量创建效果不错。上面的语句总是在数据库中创建新条目。 问题答案: 来自官方sequelizejs参考。 可以通过使用该选项来完成。 例如这样: 是一个字段数组,当主键(或可能是唯一键)与行匹配时将更新。确保您的模型中至少有一个唯一字段(让我说id),这两个字段中都包含upsert。

  • 问题内容: 我有一个具有主键和称为的列的270k行数据库,并且我有一个带有Mid和值的文本文件。现在,我想更新表,以便将每个值分配给正确的中间值。 我当前的方法是从C#中读取文本文件,并为读取的每一行更新表中的一行。必须有一种更快的方式来做我感觉到的事情..有什么想法吗? 编辑:表中还有其他列,所以我真的需要根据中点 更新 的方法。 问题答案: 您可以使用SQL Server导入和导出向导: ht

  • 我有两个结构相同的表,我想使用另一个表的数据更新一个表,匹配主键。SQLite有一个with(CTE)语句,但以下语句不起作用(sqlite3 v.3.29.0): 我尝试过使用“选择main.ID作为ID,选择temp.Desc作为Desc”,但得到了相同的错误消息。

  • spring-data-mongodb从1.9.0.release开始支持批量更新。 mongoTemplate具有名为void save(Object objectToSave)的函数;我想插入/更新整个记录,但不是某些特定字段。有什么方法或函数可以使更新类无效吗?