5

Prevayler は、すべての書き込み (そのトランザクションを介して) が同期されることを保証します。しかし、読み取りはどうですか?

(ユーザー コードで) 明示的な同期が使用されていない場合、ダーティ リードが可能であるというのは正しいですか?

ビジネスオブジェクトが次のように読み取られる場合、それらは可能ですか。

// get the 3rd account
Accont account = (Bank)prevayler.prevalentSystem().getAccounts().get(2);

?

もしそうなら、どの同期戦略がユーザーコードに適していますか?

(ビジネス オブジェクト A にビジネス オブジェクト B のコレクションが含まれているとします)、

  • java.util.concurrent パッケージなどから (A 内の B の) 同期されたコレクションを使用しますか?
  • トランザクション内のコレクションの書き込みとトランザクションの外部のコレクションの読み取りを同期します。
4

2 に答える 2

4

推奨される方法は、JMatch Query と Prevayler.execute(Query) を使用することです。直接またはサブクラス化を使用して。

返される結果は、プリミティブ値または不変オブジェクトのいずれかでなければなりません。可変オブジェクトを返す場合は、JMatch Query をサブクラス化して、これらのディープ コピーを作成する必要があります。このようにして、すべての適切な読み取りを他の (適切な) 読み取りと書き込みでロックするシステムを取得します。これにより、特にマルチスレッド プログラミングの経験がない開発者にとって、開発のスピードアップと簡素化が可能になります。

まれなケースであると思われる高い同時負荷の下でより多くのパフォーマンスが必要な場合は、実際に上記の詳細なロックを使用できます-「同期」と java.util.concurrent を使用します。

詳細については、このディスカッションを参照してください。

于 2009-01-26T08:00:53.707 に答える
1

Prevaylerを見てから本当に長い時間が経ちました(約6〜7年前にPOCプロジェクトで使用しました)。Prevaylerを介してすべての読み取りと書き込みを行う場合、それ以上の同期は必要ないと確信しています。確かに、私が行ったことを行う必要はなく、データストアを使用する複数のスレッドがありました。

于 2009-01-24T06:32:22.570 に答える