0

使用可能なアクセススロットを格納するテーブルがデータベースにあるJavaでアプリケーションを作成しています。

基本的に、ユーザーがリクエストを行うと、プログラムはオープン(未使用)スロットを持つテーブル内のレコードを見つける必要があります。ユーザーのデータがユーザーに送信されると、そのスロットは使用済みとしてマークされ、使用できなくなります。

私が混乱しているのは、多くの同時リクエストを処理する方法です...たとえば、2つのリクエストが同時に着信した場合、両方がテーブルから同じスロット(レコード)を取得する可能性はありませんか?同時リクエストが多数ある場合でも、各リクエストが一意の未使用スロットを選択し、すべてのリクエストが異なる未使用スロットを選択するようにするにはどうすればよいですか。

もう1つ、私にはたくさんのスロットがありますが、2つの異なるリクエストによって1つのスロットがピックアップされないことが重要です。ただし、これでも将来的にはリクエスト数が大幅に増えると変わる可能性があります...だから、私が説明した方法で膨大な数のリクエストを処理するように構築されたソリューションが必要です。

4

4 に答える 4

2

あなたがしたいことは接続プールと呼ばれます(ここでtomcatを使用する例)。上記の問題の解決策は、データベースが許可するセマフォリングシステム、具体的にはトランザクションを使用することです。

まず、テーブルを読んで、未使用の最初のレコードを見つけます。番号をアプリケーションに伝播します。次に、レコードを排他的に(書き込み用に)開こうとします。レコードがまだ使用されていないかどうかを再度確認し、使用されていない場合は、レコードのデータをフェッチします。データをレコードに保存してリリースします。ただし、書き込み用に開いたときにレコードが突然使用された場合は、フォールバックして新しいレコードをもう一度探し、メカニズムを繰り返す必要があります。

于 2012-05-29T12:39:36.887 に答える
1

スロットピックアップ要求を同期キューに入れます。このようにして、スロットピックアップがFIFO(先入れ先出し)であることを保証します。あなたはこれを使うことができます

于 2012-05-29T12:29:18.157 に答える
1

どのDBを使用していますか?MySQLSELECT ... FOR UDPATEは行ロックをサポートしています。

于 2012-05-29T12:35:27.477 に答える
1

これを試して、

スレッドセーフアクセスに使用ArrayBlockingQueueします。これにより、一度に1つのスレッドのみがレコードにアクセスできるようになります。

于 2012-05-29T12:46:53.427 に答える