私のWebアプリケーションではConcurrency Problem
、JPAIDGenerationを取得します。私はTable
生成戦略を使用します。すでにJPAID生成の同時実行の問題が発生しています。
Concurrency Problem
JPA ID生成で回避するにはどうすればよいですか?ID生成のためのより良い方法は何でしょうか?Spring 3.0にはそれを回避する方法がありますか?
実際、他のID生成戦略を使用する場合、データベースの依存関係について心配します。
私のWebアプリケーションではConcurrency Problem
、JPAIDGenerationを取得します。私はTable
生成戦略を使用します。すでにJPAID生成の同時実行の問題が発生しています。
Concurrency Problem
JPA ID生成で回避するにはどうすればよいですか?ID生成のためのより良い方法は何でしょうか?Spring 3.0にはそれを回避する方法がありますか?
実際、他のID生成戦略を使用する場合、データベースの依存関係について心配します。
EclipseLinkは通常、生成されたIDを割り当てるために別のトランザクションを使用します。JTA DataSourceを使用する場合、persistence.xmlで非jta-datasourceも指定しない限り、使用できません。
また、データベーストランザクションを早期にトリガーした場合(フラッシュなど)、シーケンス接続プールを指定しない限り、テーブルIDの生成ではトランザクション接続を使用する必要があります。
http://www.eclipse.org/eclipselink/documentation/2.4/jpa/extensions/p_connection_pool_sequence.htm#BABIDAGHを参照して ください。
Oracleでは、次のように自律トランザクションを使用してストアドプロシージャを作成できます。
CREATE OR REPLACE PROCEDURE GETAPPLICATIONSEQUENCE (
name IN VARCHAR,
offSet IN NUMBER,
seqValue OUT INTEGER
)
AS PRAGMA AUTONOMOUS_TRANSACTION;
BEGIN
SELECT sequence_value INTO seqValue FROM sequence_table WHERE sequence_name = name FOR UPDATE;
UPDATE sequence_table SET sequence_value = sequence_value + offSet WHERE sequence_name = name;
COMMIT;
END;
これで、データベースコード内からこのストアドプロシージャを呼び出すことができる限り、必要なシーケンスの名前を渡してオフセットし(1つのチャンクで複数の値を取得するため)、シーケンス値を取得できます。SQLServerにAUTONOMOUSトランザクションと同等のものがあるかどうかを確認する必要があります。
そのリンクが示すように、一部のJPAプロバイダーは、値の生成などに個別の接続を使用します(DataNucleus JPAは確かに使用します)。したがって、これは問題を回避します。JPAプロバイダー(指定していません)によって異なります。
その場合、IDを生成するためにデータベースに依存するべきではありません。キーとして使用できUUID
ます。これらは互いに独立して生成できるため、同時実行の問題が発生することはありません。ただし、UUIDの128ビットが現在の主キー列に収まらない可能性があるため、データベーススキーマをサポートするように変更する必要があります。