Eclipselinkが再起動するたびにすべての割り当てを消費するのはなぜですか?

StackOverflow https://stackoverflow.com/questions/4037669

質問

エンティティのIDについて、EclipsElinkは、要素テーブル(2)ではなく、同じセッション(1)で割り当てられた以前に偉大なID 1 +を割り当てることに気付きました。これは私のアプリケーションの期待に反します。

2を行うように言う最も簡単な方法は何ですか?

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private int objId;

そして、これが私がデータベースに持っているものです:

ij> connect 'jdbc:derby:db';
ij> set schema memo;
0 Zeilen eingef?gt/aktualisiert/gel?scht
ij> select * from meaning;
OBJID      |LASTPUBLI&|USR_EMAIL                                                                                                                       
-------------------------------------------------------------------------------------------------------------------------------------------------------
1          |NULL      |NULL                                                                                                                            
2          |2010-10-27|NULL                                                                                                                            
51         |NULL      |NULL                                                                                                                            
101        |NULL      |NULL                                                                                      
役に立ちましたか?

解決

使用する場合 GenerationType.AUTO Derbyとの戦略、Eclipselinkはデフォルトです テーブルジェネレーター ストラテジー。

次に、生成するとき Id 必要です、エルはに従ってIDを事前に繰り返します allocationSize (デフォルトでは50です)。そうするために、最初に生成された最後の値を保存する列を更新して、 allocationSize:

UPDATE SEQUENCE SET SEQ_COUNT = SEQ_COUNT + ? WHERE SEQ_NAME = ?
    bind => [50, SEQ_GEN]

そして、新しい値を読みます:

SELECT SEQ_COUNT FROM SEQUENCE WHERE SEQ_NAME = ?
    bind => [SEQ_GEN]

完了したら、Elは電流を使用してIDのプールを事前に伝えます 価値 - + 1を「最初」として割り当てます 価値 「最後」として:

local sequencing preallocation for SEQ_GEN: objects: 50 , first: 1, last: 50

また、メモリからIDを最後の値に達し、サイクルを再起動するまで提供します。

JVMを再起動すると、ELのための他の安全な方法は、新しいIDのプールをPreallocateして、使用されていない(マルチJVMなどを考えてください)範囲から「失う」こと以外はありません。例では、2から51の「ジャンプ」について説明します。

あなたがこれを避けたいなら、私の提案は IDENTITY ダービーによってサポートされている戦略(テーブルジェネレーターを使用するように設定することはないと思います allocationSize 1つは良い考えでしょう)。


1の割り当てを使用するようにテーブルジェネレーターを構成することが良い考えだとは思わない。なぜだめですか?

各挿入物の「シーケンス」テーブルから読む必要がある場合、パフォーマンスがヒットしたためです。しかし、一方で、1)これはあなたのケースでは懸念ではないかもしれません2)それが真に順次IDを取得できる唯一の戦略です。

興味がある場合は、これをグローバルに構成できるはずです table-generator XML記述子の要素。

エルはアイデンティティ戦略を非常に落胆させますが、それに加えて、鉱山があるように見えます(価値を読む前にコミットするのを待たなければならないので、私はどこかでやっているかもしれません)。

まあ、私はELを確認することはできません(私は今これをテストしません)が、Hibernateは即時の挿入を実行します persist あなたが使用するとき IDENTITY ストラテジー。エルは同じように振る舞うと思った。しかし、私は間違っているかもしれません、これは仕様によって義務付けられていないようです。

参照

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top