Spring Boot jpa标识,新行的ID向前跳跃10K [重复]
Posted
技术标签:
【中文标题】Spring Boot jpa标识,新行的ID向前跳跃10K [重复]【英文标题】:Spring boot jpa identity, ids of new rows jumped forward by 10K [duplicate] 【发布时间】:2021-09-25 02:52:59 【问题描述】:我正在使用 Spring Boot JPA 2.1.18。 我所有的模型类都派生自这个基类:
@Getter
@Setter
@MappedSuperclass
@EntityListeners(AuditingEntityListener.class)
public abstract class DbEntity
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
protected Long id;
....
一切正常,但我遇到了一个奇怪的行为,其中 id 用于数据库中的新行(我正在使用 SqlServer):
如您所见,id 突然向前跳跃了 10000,我不明白为什么(java 代码不可能保留 10000 个 id,因为我没有批处理)。有什么建议吗?
【问题讨论】:
大概id
是IDENTITY
?如果是这样,这是完全可以预料的。这不是 Java,这是 SQL Server 上的设计。 IDENTITY
列不应该是连续的,它只是保证下一个值会大于上一个生成的值,并且每个都是原子生成的。
【参考方案1】:
这是因为 SQL Server 中有一个名为 IDENTITY_CACHE 的选项,请查看 Microsoft 的此页面,其中解释更多
https://docs.microsoft.com/en-us/sql/t-sql/statements/alter-database-scoped-configuration-transact-sql?view=sql-server-ver15
要禁用它,请在您的数据库下运行以下命令
USE DatabaseName
GO
ALTER DATABASE SCOPED CONFIGURATION SET IDENTITY_CACHE = OFF
GO
请注意,这可能会降低性能
【讨论】:
请注意,关闭IDENTITY_CACHE
确实会降低性能。缓存就在那里,因为 SQL Server 在使用之前缓存所需值的性能要高得多,而不是每次需要时都抓取下一个。以上是关于Spring Boot jpa标识,新行的ID向前跳跃10K [重复]的主要内容,如果未能解决你的问题,请参考以下文章
可以将@Id添加到映射到Spring boot Jpa中没有主键列的表的实体吗?
Java/Spring Boot Web 应用程序。插入具有自动递增 id 列的新行