1

データベーステーブルで規則性の競合が発生しているため、この問題を解決するためのさまざまなオプションを評価したいと思います。

そのためには、テストケースで、再現性のある信頼性を備えたテーブル(任意のテーブル)での競合を再現する必要があります。

私が検討しているアプローチは、ロックのセマンティクス(eg java.util.concurrent.locks.ReentrantLock)を逆にし、テーブルへの書き込みが開始されたときにロックを解放して、書き込みが開始されたときにすべての読み取りが行われるようにすることです。

したがって、1つのライタースレッドがテーブルへの挿入を実行する直前までロックを保持し、次にロックを解放すると、複数のリーダースレッドが同じテーブルに対してselectステートメントを実行しようとします。

そのようなアプローチについて何か考えがあるのか​​、それとも100%の信頼性でdbテーブルの競合を再現できるより単純なアプローチがあるのか​​疑問に思いました。

ありがとう

4

2 に答える 2

2

カウントが。のCountDownLatchを使用できます1

final CountDownLatch barrier = new CountDownLatch(1);

すべてのリーダースレッドを起動します。最初のアクションは

barrier.await();

その後、ライタースレッドは

barrier.countDown();

その時点で、すべての読者は陽気に発砲します。

于 2009-12-16T18:01:29.363 に答える
0

データベースで競合を発生させるのがどれほど簡単かは、データベースに大きく依存します。たとえば、Oracleを使用している場合、selectを実行しても競合は発生しません。

データベースで競合を発生させる最も簡単な方法は、更新する必要があることがわかっている行で読み取りの選択を行うことです。

編集:質問を読み直した後、更新の競合よりもデータベースでの「リーダー」の競合に関心があるようです。上記のアイデアは、更新の競合を強制するために使用できますが、リーダーの競合は使用できません。

大量のリーダーを起動してデータベースをselectで溢れさせたい場合、実際の競合は発生せず、飢餓のみが発生するはずです。別の回答で説明されているように、CountDownLatchを使用するか、昔ながらの方法で実行できます。 1.5より前のJVMで実行する必要がある場合は、Object.wait / Object.notifyAll()を使用します。

編集2:コメントを読んだ後、表示されている競合をエミュレートする最も簡単な方法は、Sybaseのlocktableコマンドを使用することです。テーブルをロックし、selectを起動して、テーブルのロックを解除するだけです。その後、selectはすべて起動するはずです...これには、モデル化しようとしている状況を最も正確にエミュレートするという利点もあります。

于 2009-12-16T20:15:10.130 に答える