2017-03-27 76 views
1

我使用Hibernate 4和Oracle 11g。有这样一个代码的对象映射到数据库:休眠和Oracle夸大序列递增

@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 

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

回答

2

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

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

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

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

+0

根据@ john16384的回答和本文档[链接](https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm#sthref2219),“数据库没有等待事务增加了一个序列,然后再次增加序列“。现在很清楚,谢谢你的考虑。 –

+0

为什么'max_value'是'9999999999999999999999999999'? –