2016-08-26 6 views
0

冬眠するのが初めてです。以下のいずれかが間違っている場合は、私を修正してください。休止状態でのパフォーマンスの問題

ID生成にシーケンス生成器を使用しているエンティティがあります。このため、すべての挿入が1のシーケンスを取得するために2つのコールをしているとallocationsizeについての私の研究の間に挿入し

@Id 
@SequenceGenerator(name="i_gen", sequenceName="b_seq", allocationSize=6) 
@GeneratedValue(generator="i_gen") 
private Long id; 

を行うことは、他の私が割り当てサイズを指定するにはそれを理解し、我々は今後数allocatedsizeのためのDBを呼び出すことはありませんが、単純に1ずつ増加します。しかし、私はこの動作を見ません。私が間違っているなら、私を修正してください。

次は私が単一のトランザクションで挿入6つのオブジェクトの場合

[INFO ] [26082016.002159] sqltiming:357 - select b_seq.nextval from dual {executed in 69 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 174 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 74 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 77 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 78 msec} 
[INFO ] [26082016.002200] sqltiming:357 - select b_seq.nextval from dual {executed in 161 msec} 

を参照してくださいSQLのログです、私はNEXTVAL取得し、6つの挿入するDBへの6つのコールを参照してください。バッチインサートを使用してインサートを最適化しました。しかし、私はseqジェネレータの問題を回避することができません。私はこれのために巨大なパフォーマンスのヒットを参照してください。

seqnumberを取得するために非常に多くのdb呼び出しを行うことはできません。

+0

構文は覚えていませんが、主キーのブロックをJVMに一括して事前割り当てしてから使用できます。 – farrellmr

+0

期待通りです。他のJPAは、私が使用したのは、各挿入にシーケンスを呼び出さず、割り当てを使用してそれらをキャッシュするということです。私は通常、 '@ SequenceGenerator'がCLASSレベル(必須ではありません)で指定されることを期待し、' @ GeneratedValue'(より重要なもの)のstrategy = GenerationType.SEQUENCEを見てください。 –

答えて

1

DBシーケンスをINCREMENT BY 6に設定する必要があります。 説明:here allocationSize = nは、「n個のpersist呼び出しごとにデータベースに次の値を1回ずつフェッチし、その間に1ずつローカルに値を増やします。」また、this answerをチェックしてください。