- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
现在我正在尝试增强 Web 应用程序的性能,我使用 spring JPA 2.3.0- Hibernate 5.4.15.Final、Postgres 12 并通过 @Transaction 管理事务。 Web应用程序部署在aws beanstalk上,同时运行多个实例,但数据库实例不可扩展。我使用 bigSerial 类型作为表的 ID。
例如,我有一个 STUDENTS 表,ID 是 bigSerial 和一些其他列。我在使用时遇到问题
@GenerateValue(strategy = GenerationType.IDENTITY)
,保存实体列表时,Hibernate 无法批量插入。我尝试使用
@GeneratedValue(strategy = GenerationType.AUTO, generator = "students_id_seq")
@SequenceGenerator(name = "students_id_seq", sequenceName = "students_id_seq")
hibernate.id.new_generator_mappings=false
hibernate.jdbc.batch_size=10
hibernate.order_inserts=true
hibernate.order_updates=true
hibernate.batch_versioned_data=true
看起来 Hibernate 可以批量插入,但问题是 Hibernate 多次执行 select nextval ('students_id_seq')
。如果实体列表有 30 个项目,Hibernate 会执行 select nextval
30 次,批量插入查询则执行 3 次。
一些统计数据:
如果使用 GenerationType.IDENTITY
插入...
:执行一次插入...
:执行n次如果使用 GenerationType.SEQUENCE/GenerationType.AUTO
select nextval('students_id_seq')
:执行一次插入...
:执行一次select nextval('students_id_seq')
:执行n次插入...
:执行n/batch_size次总之,如果将 GenerationType.AUTO
或 GenerationType.SEQUENCE
与 allocationSize = 1
一起使用:
我的问题是,是否可以批量插入但不执行许多 select nextval
查询?类似于GenerationType.IDENTITY
,不执行select nextval
,只是批量插入,ID将按数据库中的顺序处理。
当我使用 GenerationType.SEQUENCE
和 allocationSize=1
(GenerationType.AUTO)
进行测试时,应用程序执行了过多的 select nextval
查询,我认为它比IDENTITY策略还要糟糕。由于某些原因,我不想使用 allocationSize
,它可能会导致在手动运行插入查询或迁移数据或其他一些情况时出现重复主键错误。
经过一番研究,我找到了一种获取序列值列表的方法:
从generate_series(1,10)中选择nextval('students_id_seq');
我们可以用entityList.size()替换10,或者批量插入时entityList中没有ID的实体数量,够用即可,不要在ID之间造成太大的差距,但我不是确定是否支持Hibernate,如果支持,请分享给我引用文档。
谢谢
https://discourse.hibernate.org/t/batch-insert-execute-too-much-select-nextval-sequence/4232
最佳答案
您正在寻找的是HiLo algorithm用于生成 id。
对于从序列生成的每个 id,它会在客户端上生成许多 id,而无需访问数据库。
您在实体上将其配置如下:
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "hilo_sequence_generator")
@GenericGenerator(
name = "hilo_sequence_generator",
strategy = "org.hibernate.id.enhanced.SequenceStyleGenerator",
parameters = {
@Parameter(name = "sequence_name", value = "hilo_seqeunce"),
@Parameter(name = "initial_value", value = "1"),
@Parameter(name = "increment_size", value = "3"),
@Parameter(name = "optimizer", value = "hilo")
})
@Id
private Long id;
关于java - Spring JPA- hibernate : Batch insert execute too much select nextval (‘sequence’ ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62254314/
我有一个这样声明的表列: file_id number(10) generated always as identity primary key, 是否有可能以编程方式获得 currval/nextv
基本上,我需要从一个序列中查询大约一千个 NEXTVAL。我可以循环查询它们,或者我可以通过与一个非常大的表的连接来查询它们。 有没有更简单的方法? 更新。 基本上,我有一个对对象的操作计划。每个对象
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
我正在使用 oracle 数据库并面临一个问题,其中两个 id_poduct.nextval 创建为错误:ORA-00001:违反唯一约束 (SYSTEM.SYS_C004166) 这是一个主键。使用
实际上我们对一些方法使用了 @Transactional(readOnly=true) 但这些方法以某种方式执行 nextVal() 这对其他数据库来说很好但是在 Postgres 9.6.3 上它会
我需要能够生成运行查询,该查询将返回下表中的ID的下一个值: CREATE TABLE animals ( id MEDIUMINT NOT NULL AUTO_INCREMENT,
我需要增加我的 ID。我必须通过在 oracle 数据库中使用序列来增加。当我使用 INSERT INTO XXX (seq_xxx.nextval, ....) 时出现错误 invalid colu
我想创建一个可以直接复制到 MS Excel 中的模板(通过 SQL)。 总的来说,这很顺利,但是,我遇到了应该存储 Excel 公式的字段的问题。根据用户在 Excel 工作表列之一中的输入,该字段
我的应用程序中有这个 SQL 脚本: select my_seq.nextval from dual connect by level <= 100; 它工作得很好,但是一旦我看到(在日志中)它根本没
我正在使用 spring jdbctemplate 将行插入 mysql 数据库,在批量插入 mysql 数据库时遇到问题。问题是,插入第二行时,我的主键出现重复键冲突。我已将 USER_KEY 放入
我已经寻找并没有找到这个问题的答案: 我使用嵌套选择插入一行,但还需要 uid 序列和日期戳 SQL 插入 insert into countdegreejob (countdegreeid,j
我正在测试 postgresql 序列(使用 http://sqlfiddle.com 和 PostgreSQL 9.3 我目前没有在本地设置 PostgreSQL),但我看到了奇怪的行为。 创建一个
我有一个有维护菜单的应用程序(当然只在极少数情况下使用)。在此菜单中,我还显示了某个序列接下来将生成的下一个数字,并为用户提供了重置序列的选项。 我使用以下查询来显示下一个数字: select cas
我有以下 sql: INSERT INTO in_api_settings ( ENTITY_ID, ACTIVE_START_DATE, ACTIVE_END_DATE) VA
我有一个 PgSQL 9.4.3 服务器设置,之前我只使用公共(public)模式,例如我创建了一个这样的表: CREATE TABLE ma_accessed_by_members_tracking
我在模式中有一个关于 postgresql 9.3 的序列。 我能做到: SELECT last_value, increment_by from foo."SQ_ID";` last_value |
我尝试插入到以sequence .nextval为主键的表中,Java中的sql是 sql = "INSERT INTO USER (USER_PK, ACCOUNTNUMBER,
使用 SQLPlus,我生成了以下序列: CREATE SEQUENCE pubnum_seq START WITH 7 INCREMENT BY 2 MAXVALUE 1000; 我想要做的
如何在一次查询中两次选择相同的序列? 我已经用谷歌搜索了这个,只是无法得到答案。 为了清楚起见,这就是我需要的,例如: select seq.nextval as v1, seq.nextval as
我有以下 3 个表, 数据_Excel 包含姓名、地址、城市和人员来源; 人表 有姓名和身份证; 我需要插入 person_location 地址来源、地址、城市和ID... 我正在使用以下查询: C
我是一名优秀的程序员,十分优秀!