2012-02-01 14 views
3

JavaプロジェクトでHibernateを使用していますが、Oracle DBがあります。 ID列は、私は、増分1でシーケンスを識別しかし、これはJPA/Hibernateはシーケンスからnextvalを実行し取得する方法である:JPA/HibernateでOracleシーケンスの値が多すぎます

1 1451 
2 1450 
3 1402 
4 1401 
5 1400 
6 1352 
7 1351 
8 1350 
9 426 

あなたはnextValは、時には1を取得していることがわかりますが、ほとんどが50以上のことができます。開始値1を設定しても、シーケンス200の開始さえわかります。なぜこれが起こっていますか?これは正常ですか?

この「50」増分を何とか減らすことはできますか?

編集:データベースは、シーケンスからあなたのフェッチの間にシャットダウンを取得している場合hibernate oracle sequence produces large gap

+0

は、Oracleた解決その時間中にシャットダウンしますか? –

+2

http://stackoverflow.com/questions/5346147/hibernate-oracle-sequence-produces-large-gapを参照してください。重複も可能です。 –

+0

ありがとう、Vineet Reynolds。私はそれを確認します。 –

答えて

6

この解決策が見つかりました。

  1. 私はそれがここで説明したように、私は@Id財産の注釈@SequenceGeneratorに "allocationSize=1" を入れ
  2. "キャッシュなし" としてシーケンスのキャッシュを作っ:https://stackoverflow.com/a/5346701/169534

問題は

0

の重複は、あなたのシーケンスは50のキャッシュサイズを持っている場合は、この問題が表示されることがあります。残りのキャッシュされた値は、データベースがシャットダウンするときには決して使用されません。

+0

いいえ、「シャットダウン」が重大な高負荷値でのみ発生しても、頻繁にシャットダウンされることはありません。 –

+0

キャッシュについては正しいですが、データベースをシャットダウンする必要はありません。基本的に、オラクルは50のネクストバリューをキャッシュし、使用しない場合はキャッシュからエージングできます。 nextvalが呼び出されると、別の50個の値がキャッシュされます(キャッシュ内の前の値を投げる)。 – tbone

+1

シーケンスで「no-cache」としてキャッシュ値を作成/変更すると、その値が解決されますか?それは何とか問題になるのだろうか? –

関連する問題