2017-12-26 5 views
0

Hibernate javax.persistence.SequenceGenerator.allocationSize()プロパティを使用する際に問題があります。 1に設定すると、大量のレコードをデータベースに挿入するときにパフォーマンスの問題が発生します。それ以外の場合、デフォルト(50)またはそれ以上の値に設定すると、指定した識別子を持つエンティティがalredyであるという例外が発生します。javax.persistence.SequenceGenerator.allocationSize()はINCREMENT BYと一致する必要がありますか?

大きな問題は、多くの開発者が共有データベースを使用しているため、生成された識別子が同期化されない可能性があることです。

一方、私はOracleシーケンスが「INCREMENT BY 1」を使用して作成されていることに気付きました。これに応じてallocationSizeを設定して問題を解決できますか?

私はWildFly 10.1(Hibernateバージョン5.0.10)とOracle 12c(12.2.0.1)を使用しています。

ご協力いただきありがとうございます。

+0

はい。それらが同じでない場合は、この問題が発生します。インクリメントbyはシーケンスのデータベース設定ですが、allocationSizeプロパティはJPAの値であり、より多くのシーケンスに戻る前に使用できる数値の数を示します。 – Chris

答えて

0

はい、SequenceGeneratorallocationSizeの値と、データベースがシーケンスをインクリメントする手順は同じである必要があります。

allocationSize属性を50に設定すると、シーケンスが50ずつインクリメントされ、シーケンスから次の値を選択する前に49個の値が生成されることをHibernateに伝えます。

allocationSizeとシーケンスのインクリメントを同期させておけば、重複IDについて心配する必要はありません。

同じデータベースに接続する2台のサーバーがあります。どちらのサーバーもallocationSizeを50、データベースシーケンスを50ずつ増やすように構成しました。

サーバー1はシーケンスから新しい値を要求して1000を取得します。この値は内部的に保存され、1049に達するまでインクリメントします。一方

、Server2があなたが見ることができるように、データベース配列で返さ1099

次の値が、1100になりますまで、それはこの値をインクリメントするシーケンスから新しい価値を要求し、1050を取得します重複IDはありません。しかし、主キー値の間にはギャップが存在する可能性があり、それらを使用してデータベースレコードを時系列順に並べ替えることはできません。しかし、それにとにかにプライマリキーを使うべきではありません...

関連する問題