gpt4 book ai didi

java - Hibernate 序列生成非连续值

转载 作者:行者123 更新时间:2023-11-29 10:07:37 25 4
gpt4 key购买 nike

我正在使用 hibernate 序列生成器为我的主键列自动生成唯一值。示例代码如下。

@Entity
@Table(name = "REQUEST")
@javax.persistence.SequenceGenerator(name = "REQ_SEQ", sequenceName = "REQUEST_SEQ")
public class Request {
/**
* Unique id for this request
*/
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "REQ_SEQ")
@Column(name = "REQ_ID")
private long requestId;
//So on
}

一切正常,除了生成的值是交错的。例如,它插入从 5000 到 5015 的值(15 次插入),然后第 16 次插入产生 5100 的值。然后它在随后的几个插入中工作正常,再次出现问题。只要生成的值是唯一的,我就没有任何问题,但只是想知道是什么原因造成的。仅供引用,我正在使用 Oracle。

最佳答案

Oracle 序列就是这样工作的。它们仅保证唯一性,但不保证连续值,因为这会妨碍并行性。

他们在内部所做的或多或少是这样的:当您请求序列中的下一个值时,Oracle 会预先计算一大块值(在您的情况下为 5000-5099)并将其放入序列缓存中,然后设置 seq. nextval = 5100 在磁盘上。但是,如果由于 Activity ,数据库必须从缓存中丢弃您的值 block ,则下次访问 seq.nextval 时,它将占用另一个 block 5100-5199。也就是说,Oracle 甚至不会尝试保存已放入缓存中的序列值。

重点是序列缓存是一种内存结构,它比序列本身更快、更可并行化,序列本身是一种磁盘结构。当我们想要扩大规模时,我们希望尽可能避免使用磁盘。

您可以使用序列 DDL 中的 CACHE 子句控制给定序列的 block 大小:

CREATE SEQUENCE seq2
CACHE 50;

关于java - Hibernate 序列生成非连续值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3624261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com