2

休止状態で生成された識別子の問題に直面しています。Sequence Generator を使用して識別子を生成しています。データベースは Oracle 11g で、休止状態バージョン 3.6.1 です。

hibernate のデフォルトの allocationSize が 50 であることを認識しているため、hibernate は 50 回の挿入ごとにデータベースを呼び出して識別子をフェッチします。したがって、以下のようにデータベース呼び出しを減らすために、allocationSize を 1000 に変更しています。

    @GeneratedValue(generator = "test_gen", strategy = GenerationType.SEQUENCE)
    @SequenceGenerator(name = "test_gen", sequenceName = "myschema.my_oracle_sequence", allocationSize = 1000)

ただし、問題はほとんどありません。

まず、これは機能拡張であるため、休止状態のバージョンをアップグレードして新しいシーケンス ジェネレーターを利用することはできません。

第二に、これは他の休止状態のエンティティに影響を与えるため、以下のプロパティを使用することはできません。これは私の変更によって影響を受けるべきではありません.以下のプロパティを1つのエンティティのみに適用するように休止状態に指示する方法はありますか?

    hibernate.id.new_generator_mappings=true

第三に、以下の休止状態固有のマッピングを試しました。ただし、ここで初期値を指定する必要があります。そうでない場合は、初期値を 1 として識別子を計算し、識別子が既に使用されているため、予想どおり制約例外を取得します。コードが既に使用されており、シーケンスのプライマリ ID と nextval の両方が初期値から移動しているため、ここで再び初期値を指定することはできません。

    @GenericGenerator(
    name = "sequenceGenerator", 
    strategy = "enhanced-sequence",
    parameters = {
        @org.hibernate.annotations.Parameter(
            name = "optimizer", 
            value = "pooled"
        ),
        @org.hibernate.annotations.Parameter(
            name = "increment_size", 
            value = "500"
        )
    }
)
@GeneratedValue(
    strategy = GenerationType.SEQUENCE, 
    generator = "sequenceGenerator"
)

第 4 に、最初のコード ブロックで言及したコードを使用することはできません。レコードを挿入するときに UniqueConstraintViolationException がランダムに表示されるためです。 JPA 2 @SequenceGenerator @GeneratedValue で一意の制約違反が発生する

これらすべての制約がある中で、allocationSize を増やしてレコード挿入のパフォーマンスを向上させる方法はありますか。1 回のバッチで約 1,000 ~ 4,000 万件のレコードを挿入します。

よろしく、V

4

0 に答える 0