JPA生成策略TABLE和SEQUENCE的区别

问题描述 投票:0回答:1

我将 Spring boot 与 MySql 和 Hibernate 一起使用。我有一个简单的应用程序,其中有用户表。

@Entity(name = "user")
Public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.SEQUENCE)
    @Column(name = "id")
    private int Id;
    // Getters Setters and remaining attributes

然后我使用 Spring Transaction 在用户表中插入 20 条记录

for(int i = 0; i < 20; i++) 
 userService.save(new User("fName"+i, "lName"+i);

我可以看到所有 20 个插入查询的以下输出

Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)
Hibernate: select next_val as id_val from hibernate_sequence for update
Hibernate: update hibernate_sequence set next_val= ? where next_val=?
Hibernate: insert into user (fname, lname, id) values (?, ?, ?)

根据我对 GenerationType.SEQUENCE 的理解,它应该只从数据库查询一次,之后休眠不应该从数据库查询下一个序列并继续生成序列,直到达到下一个allocationSize(默认为50)。为什么它总是在数据库中查询所有 ID。 在我看来,这种行为应该反映在 GenertaionType.TABLE 中(如果我更改它,就会发生这种情况)

jpa sequence
1个回答
0
投票

为了避免数据库命中,您应该使用 pooled-lo 优化策略。

另外,在使用MySQL数据库时,生成策略TABLE和SEQUENCE之间没有太大区别。由于 MySQL 不支持序列,因此这两种策略都会创建一个基础表来维护主键计数器,如herehere所述。

唯一的区别是 TABLE 生成器在多个实体的同一个基础表中维护主键 next_val 计数器,而 SEQUENCE 生成器将 next_val 存储在单独的表中,还可以在这里找到性能比较

© www.soinside.com 2019 - 2024. All rights reserved.