2017-03-27 18 views
1

私はHibernate 4とOracle 11gを使用しています。 DBにオブジェクトをマッピングするための、そのようなコードを有する:HibernateとOracle overstateシーケンスのインクリメント

@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; 

Iは、(いくつかの時間後)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は、20個のIDを予約する最適化を使用できることを示しているため、挿入ごとに順序を確認する必要はありません。それらがすべて使用されていない場合、これはギャップを残す可能性があります。複数の接続を介してデータベースにアクセスする場合、関連するテーブルを変更する必要がある場合は、各接続で20個のIDを予約できます。

第2に、ロールバックされたトランザクションは、データベースに応じてギャップを残す可能性があります。これはかなり正常です。

これを修正する理由はありません。オラクル社では重複がないことを保証します。配列がギャップを持たないこと、または正確に順序通りであることを保証するものではありません。

+0

@ john16384の回答とこの文書[リンク](https://docs.oracle.com/cd/B28359_01/server.111/b28310/views002.htm#sthref2219)によると、「データベースはそのシーケンスを再びインクリメントする前に、シーケンスをインクリメントしたトランザクションが完了するのを待つ」。今はかなり明確です、あなたの配慮に感謝します。 –

+0

なぜ 'max_value'が' 9999999999999999999999999999'ですか? –

関連する問題