- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在使用 Spring Boot、Spring Batch 和 JPA
将数据从一个数据库加载到另一个数据库。在单个批处理作业中,我创建了 10 个步骤
以按顺序运行步骤,每个步骤读取近 100 万
记录(我不能并行运行,因为数据我没有并行加载)。
我使用了 GenerationType.IDENTITY
并且看起来像因为这个批处理作业占用了大量时间。如果我说要加载 100 条记录
,它需要 2 分钟
。目标 Postgres 数据库
具有由 DBA 实现的 sequences
,我们必须遵循这些,但它会耗尽所有性能。
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "EMP_ID", nullable = false, updatable = false, insertable = false)
private Long id;
如何提高这个批处理作业的性能?
我还保留了 spring.jpa.properties.hibernate.jdbc.batch_size=1000
和 chunkSize=1000
。
最佳答案
如果实体使用 IDENTITY
生成其 ID(在 here 的文档中也提到),Hibernate 无法批量插入实体。
因此您必须改为使用SEQUENCE
来生成ID。并根据this ,选择使用“pooled”或“pooled-lo”算法从序列中获取新 ID,以通过减少获取 ID 的往返次数来进一步提高性能。
所以 ID 映射看起来像:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator="emp_sequence")
@SequenceGenerator(name="emp_sequence", sequenceName = "emp_id_seq", allocationSize = 100)
private Long id;
和休眠设置:
spring.jpa.properties.hibernate.order_inserts = true
spring.jpa.properties.hibernate.order_updates = true
spring.jpa.properties.hibernate.jdbc.batch_size = 1000
spring.jpa.properties.hibernate.jdbc.batch_versioned_data = true
# For using "pool-lo" optimiser for generating ID when using JPA @SequenceGenerator
spring.jpa.properties.hibernate.id.optimizer.pooled.preferred = pooled-lo
此外,您必须确保 PostreSQL 中相应的 ID 序列与 @SequenceGenerator
中的配置对齐:
alter sequence emp_id_seq increment by 100;
另一个技巧是在 JDBC 连接字符串中添加 reWriteBatchedInserts=true
,这将提供 2-3 倍的性能提升,如 docs 中所述.
关于使用 GenerationType.IDENTITY 时,Spring Batch JPA Bulk Insert 会降低性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62411431/
目前,我们使用MySQL作为数据库,并且我们使用 @Generate Value(strategy = GenerationType.IDENTITY) 在某些情况下它工作得很好,我们需要将数据库迁移
目前,我们使用 MySQL 作为数据库,我们使用 @Generated Value(strategy = GenerationType.IDENTITY) 在我们需要将数据库迁移到 Oracle 的某
我有类似的问题 this SO question .但是我的应用程序正在 MySQL 上运行,并且有工作数据。 使用填充有数据的现有数据库重构应用程序的最佳做法是什么? 最佳答案 TABLE_PER_
我正在研究一个要求,其中代码应支持 Oracle 和 MySQL 数据库。我们正在使用 hibernate 并尝试使用框架功能来实现相同的目标。对于 Identity 列,我们使用 @Generate
我的应用程序使用 DB2。创建数据库后我运行一些插入脚本。该插入脚本会在表中生成记录,并在插入脚本中给出 id。 假设 abc 表插入脚本创建一条 id = 3 的记录。由于 id 设置为在 hibe
我有一个具有以下结构的部门表 Field Type Null Key Default Extra id int(11)
我正在从事一个项目,我需要存储一些数据(当然还有其他数据)。生产数据库将是MySQL,但对于我的测试,我使用 HyperSQL (又名 HSQLDB)。 我的所有@Enitity类都有相应的@Id字段
我有一个网络表单,用户可以在其中插入数据。然后还有存储在数据库中。但我在数据库记录中遇到了问题。我使用 spring 3、jpa、eclipselink 和 mysql。在实体中生成@Id。当我使用策
我有一个表,其中包含一个简单的 int id 列,在 SQL Server 中标识自动递增。 实体的 Id 用 @Id 和 @GeneratedValue 注释 @Id @GeneratedValue
Hibernate documentations (5.1.2.2. Identifier generator)州 AUTO: selects IDENTITY, SEQUENCE or TABLE
这是我的实体文件:- @Entity @Table(name = "tbl_article_function_instruction_status") @XmlRootElement public c
那么自动生成函数“@GenerateValue(strategy = GenerationType.AUTO)”到底是如何工作的呢? 我是 Hibernate 的新手,并且继承了一个广泛使用的项目。
我正在尝试将对象持久保存到数据库中。不断收到“列 ID 无法接受空值错误”。我的对象如下所示: @Entity public class TestTable { @Id @Ge
我有一个 ID 配置为的 hibernate 实体 @Id @GeneratedValue(strategy=GenerationType.AUTO) private Long id; 新元素的创建在
我在同一个项目中有几个类,其中 id 始终是自动生成的。然而,在这种特定情况下,我的 id 值恰好始终为空。我真的很想知道出了什么问题,因为经过一些更改后它停止工作。与其他类相比,代码似乎是相同的。
由于 Spring Boot 2 使用 Hibernate 5,因此我的 MySQL 5.7 数据库的 @GenerateValue 默认策略 GenerationType.AUTO 会导致模拟 Ge
我的实体类: import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.Ge
似乎我坚持的一切,它一直在 id 中输入 401,导致这个错误。有什么帮助吗? 异常 Exception [EclipseLink-4002] (Eclipse Persistence Service
我有一个在 JBOss 5、JPA 和 Derby 中运行良好的旧应用程序。我现在将它移植到 JBoss 6,却发现系统无法插入带有错误消息的实体: “ID”列不能接受 NULL 值。 其中,ID为标
我使用 Spring/Hibernate Dao 将我的对象保存在数据库中。现在我必须备份应用程序中的所有数据库。现在,当我尝试读回备份时,我的应用程序崩溃了。现在我发现了这个崩溃的问题。它是 Hib
我是一名优秀的程序员,十分优秀!