java - Hibernate 和 Oracle 夸大序列递增

标签 java oracle hibernate

我使用 Hibernate 4 和 Oracle 11g。有这样一个将对象映射到数据库的代码:

@Entity
@Table(name = "APPLICATION", schema = "PRODUCTION")
@XmlAccessorType(XmlAccessType.FIELD)
@XmlType(name = "Application")
@JsonIgnoreProperties(ignoreUnknown = true)
public class Application {

    @Id
    @ComparatorIgnore
    @GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "PRODUCTION.SEQUENCE_NEW")
    @SequenceGenerator(name = "PRODUCTION.SEQUENCE_NEW", schema = "PRODUCTION", sequenceName = "PRODUCTION.SEQUENCE_NEW", allocationSize = 1)
    @Column(name = "ID")
    @XmlTransient
    @Getter @Setter private Long id;

我得到了这样一个 id 序列(一段时间后),并且它继续产生带有奇怪间隙的更多值:

956493
955431
956174
955995
950593
950720
952045
950998
951905
950860
949323
950058
949084
948981
948884
948786
950182
950345
949952
950469

我认为增长会更加稳定和平稳。考虑到我有多线程应用程序,我想知道如何修复这种意外行为。 序列的定义方式如下:

CREATED         27.02.17
LAST_DDL_TIME   27.02.17
SEQUENCE_OWNER  PRODUCTION
SEQUENCE_NAME   SEQUENCE_NEW
MIN_VALUE       1
MAX_VALUE       9999999999999999999999999999
INCREMENT_BY    1
CYCLE_FLAG      N
ORDER_FLAG      N
CACHE_SIZE      20
LAST_NUMBER     957101
PARTITION_COUNT 
SESSION_FLAG    N
KEEP_VALUE      N

我错过了什么? 提前谢谢了。任何答案都将受到高度赞赏。

最佳答案

这些差距可以通过多种方式来解释。

首先,CACHE_SIZE 20 表示 Oracle 可以使用保留 20 个 id 的优化,因此不必检查每个插入的序列。如果没有全部使用,可能会留下间隙。当通过多个连接访问数据库时,如果需要更改涉及的表,每个连接可以保留 20 个 id。

其次,回滚的事务也可能会留下间隙,具体取决于您的数据库。这很正常。

没有理由修复此问题,Oracle 保证不存在重复项。它不保证序列没有间隙或完全按顺序。

关于java - Hibernate 和 Oracle 夸大序列递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43042894/

相关文章:

java - Android/Apache HTTPGET 将不起作用,但在浏览器中它可以

oracle - 使用条件 Controller sqlldr 从多行加载数据

sql - 如何处理 Oracle SQL 中的无效日期

hibernate - 无法使用 Hibernate/PostgreSQL 将欧元符号存储到 LOB 字符串属性中

java - 在 Clojure 命名空间中排除 java.lang.*

java - 设计模式 - 从不同类型的数据源创建对象

SQL EXISTS 为什么选择 rownum 会导致执行计划效率低下?

java - 无法将 java.lang.String 类型的属性值转换为所需类型实体

java - 如何在 Hibernate/JPA 中的两个表之间创建中间表?

javascript - React Native Module Callback 什么都不返回