14

Q1. : を使用してデータベースにシーケンス ID を適用することの違いは何ですか?

A.

CREATE TABLE Person
(
   id long NOT NULL AUTO_INCREMENT
   ...
   PRIMARY KEY (id)
)

B.

@Entity
public class Person {
    @Id
    @TableGenerator(name="TABLE_GEN", table="SEQUENCE_TABLE", pkColumnName="SEQ_NAME",
        valueColumnName="SEQ_COUNT", pkColumnValue="PERSON_SEQ")
    @GeneratedValue(strategy=GenerationType.TABLE, generator="TABLE_GEN")
    private long id;
    ...
}

私のシステムは高度に並行しています。私のDBはMicrosoft SQLサーバーであるため、サポートしているとは思わないため、同時実行の問題が発生しやすいもの@SequenceGeneratorにとどまる必要があります.@TableGenerator

Q2. こちらのリンク ( http://en.wikibooks.org/wiki/Java_Persistence/Identity_and_Sequencing#Advanced_Sequencing ) は、Bが同時実行性の問題を抱えている可能性があることを示唆していますが、提案された解決策はわかりません。Bでの同時実行の問題を回避する方法を誰かが説明してくれれば、非常にありがたいです。ここに彼らの解決策のスニペットがあります:

If a large sequence pre-allocation size is used this becomes less of an issue, because the sequence table is rarely accessed.

Q2.1 : ここで話している割り当てサイズはどれくらいですか? 私はやるべきですallocationSize=10allocationSize=100

Some JPA providers use a separate (non-JTA) connection to allocate the sequence ids in, avoiding or limiting this issue. In this case, if you use a JTA data-source connection, it is important to also include a non-JTA data-source connection in your persistence.xml.

Q2.2 : プロバイダーとして EclipseLink を使用しています。上記で示唆されていることをしなければなりませんか?

Q3. Bが並行性の問題に悩まされている場合、 Aも同じように苦しんでいますか?

4

2 に答える 2

15

TableGeneratorを使用すると、次のID値が検索されてテーブルで維持され、基本的にデータベースではなくJPAによって維持されます。これにより、複数のスレッドがデータベースにアクセスし、idフィールドの次の値が何であるかを把握しようとすると、同時実行の問題が発生する可能性があります。

auto_incrementタイプは、データベースにテーブルの次のIDを処理させます。挿入を実行すると、データベースサーバーによって自動的に決定されます。これは確かに同時実行に対して安全です。

アップデート:

GenerationType.AUTOの使用を妨げるものはありますか?

GenerationType.AUTOは、エンティティのIDを取得するための適切な方法を選択します。したがって、最良の場合、組み込みの機能を使用します。ただし、生成されたSQLをチェックして、そこで何が起こっているかを正確に確認する必要があります。MSSQLはシーケンスを提供しないため、GenerationType.IDENTITYを使用すると思います。

前述のように、auto_increment列は、次のID値の割り当てを処理します。複数のスレッドがデータベースに並行して取り組んでいる場合でも、並行性の問題はありません。課題は、JPAで使用されるようにこの機能を転送することです。

于 2012-04-09T15:11:05.363 に答える
15

A: IDENTITY id 生成を使用します。@GeneratedValue(IDENTITY)

B: TABLE id 生成を使用

JPA は 3 つのタイプをサポートします。IDENTITY, SEQUENCE and TABLE.

どちらにもトレードオフがあります。

IDENTITY では事前割り当てが許可されないため、INSERT のたびに追加の SELECT が必要になり、バッチ書き込みが妨げられ、id にアクセスするためにフラッシュが必要になり、同時実行性が低下する可能性があります。

TABLE は事前割り当てを許可しますが、シーケンス テーブルのロックで同時実行性の問題が発生する可能性があります。

技術的には SEQUENCE ID 生成が最適ですが、すべてのデータベースがサポートしているわけではありません。

100 の事前割り当てサイズを使用する場合、TABLE シーケンスでは、100 回の挿入ごとにのみシーケンス テーブルの行がロックされます。同時性。アプリケーションが多くの挿入を行う場合は、1000 以上の値を使用してください。

TopLinkは、TABLEの順序付けに別のトランザクションを使用するため、順序表へのロックに関する同時実行性の問題が軽減されます。JTA を使用している場合は、非 jta-datasource を指定してこれを行い、persistence.xml プロパティで sequence-connection-pool を構成する必要があります。

于 2012-04-10T14:59:14.940 に答える