Hibernate和Oracle夸大了序列递增

时间:2017-03-27 09:39:28

标签: java oracle hibernate

我使用Hibernate 4和Oracle 11g。有这样的代码将对象映射到DB:

@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

我错过了什么? 提前谢谢了。任何答案都非常感谢。

1 个答案:

答案 0 :(得分:2)

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

首先,CACHE_SIZE 20表示Oracle可以在保留20个ID的情况下使用优化,因此不必检查每个插入的序列。如果他们并未全部使用,这可能会留下空白。通过多个连接访问数据库时,如果必须更改所涉及的表,则每个连接可以保留20个ID。

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

没有理由解决这个问题,Oracle保证没有重复。它并不能保证序列没有间隙或完全按顺序排列。