1

サーバーのファームがあり、各サーバーは定期的にデータベースに対して同じクエリを実行しています。これらのクエリ結果は共有キャッシュにキャッシュされ、すべてのサーバーからアクセスできます。

新しいクエリが古いクエリによって上書きされないようにするにはどうすればよいですか?これが起こらないように、たとえば時間ごとにクエリをバージョン管理する方法はありますか?同時クエリを処理する方法は?

ありがとう!

編集:dbはSQLServerです。クエリはselectステートメントです。また、キャッシュメカニズムは非常に単純です。ロックなしの単純な書き込みです。これは、現在、選択クエリの順序を通知する方法がないためです。

4

2 に答える 2

0

1つのアプローチは、更新または読み取りのいずれかのために、データベースにグローバル更新カウンターを設定することです(更新はより効率的ですが、正しく行うのも困難です)。

したがって、更新のたびに、グローバルカウンターもインクリメントします。読み取るたびに、グローバルカウンターを読み取り、カウンター値とともにデータをキャッシュに入れます。カウンタ値が大きい場合にのみ、キャッシュの内容を上書きします。

データベースが分離されているため、トランザクションはシリアル方式で発生したように見えるはずです(SERIALIZABLE分離レベルを選択したと仮定します)。つまり、厳密に高いカウンター番号は、より最近のデータに関連していることを意味します。

于 2010-12-17T21:48:51.560 に答える
0

キャッシュはどこにありますか?ディスクファイルですか?またはデータベース内のテーブル?

また、古いクエリが新しいクエリを上書きする可能性があるとはどういう意味ですか?最も最近完了したクエリ(またはおそらく最も最近開始されたクエリ)が最新のものであるというのは本当ではありませんか?

ファイルであろうとテーブルであろうと、各クエリを実行する前にキャッシュコンテナをロックする必要があります。各サーバーは、ロックを取得できる場合にのみクエリを実行する必要があります。それ以外の場合は、ロックされたリソースを待機する必要があります。そうすれば、キャッシュには最新の結果のみが含まれます。

それはあなたが求めていることの線に沿っていますか?

于 2010-12-17T21:57:57.370 に答える