Eclipselinkが再起動するたびにすべての割り当てを消費するのはなぜですか?
-
27-09-2019 - |
質問
エンティティの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
ストラテジー。エルは同じように振る舞うと思った。しかし、私は間違っているかもしれません、これは仕様によって義務付けられていないようです。
参照
- jpa wikibook