6

ポーリング時に一意のIDを返す単純なWebサービスを作成しようとしています。IDは人間が読める形式である必要があり(つまり、GUIDではなく、おそらく000023の形式で)、呼び出されるたびに1ずつ増加します。

ここで、2つの異なるアプリケーションから同時に呼び出される可能性があり、各アプリケーションに同じ番号を返さないようにする必要があることを考慮する必要があります。

データベースを使用して現在の番号を保存する以外のオプションはありますか?

確かにこれは以前に行われたことがありますが、もしそうなら、誰かが私にソースコードを教えてもらえますか?

ありがとう、

ニール

4

2 に答える 2

1

クリティカルセクションのコードを使用して、コードのセクションを一度に1つずつフローを制御します。これは、lockステートメントを使用するか、少しハードコアにしてミューテックスを直接使用することで実行できます。これを行うと、各発信者に異なる番号を返すことが保証されます。

それを保存することに関しては、データベースを使用することは自動インクリメント番号を返すのにやり過ぎです-SQLServerとOracle(そしておそらく他のものですが私はそれらについて話すことはできません)は両方とも自動インクリメントキー機能を提供するので、あなたは、データベーステーブルに新しいエントリを生成し、キーを返すと、呼び出し元はその番号をそのレコードへのキーとして使用できます(最初の呼び出しの後でさらにデータを保存する場合)。このようにして、データベースに一意の番号の生成についても心配させることができます。データベースの詳細について心配する必要はありません。ただし、データベースがまだない場合は、これは適切なオプションではありません。

もう1つのオプションは、ローカルファイルに保存することですが、ファイルの読み取り、番号のインクリメント、および書き戻しをすべてクリティカルセクション内で行うにはコストがかかります。

于 2010-03-22T12:13:45.183 に答える
0

ファイルを使用できます。

擬似コード:

if (!locked('counter.txt'))
   counter = read('counter.txt')
else
   wait
   startAgain
lock('counter.txt')
counter++
print counter
write('counter.txt', counter)
unlock('counter.txt)
于 2010-03-22T12:13:12.547 に答える