1

SingleInstanceそれは悪いデザインだという投稿がたくさんあります。しかし、私の状況ではそれが最良の選択だと思います。
私のサービスでは、現在ログインしているユーザーのリストを(追加のデータとともに)返す必要があります。このリストは、すべてのクライアントで同じです。このリストをデータベースから5秒ごとに取得し(たとえば)、必要に応じてそのコピーをクライアントに返したいと思います。
インスタンス化モードを使用する場合PerCall、データベースからこのリストを毎回取得します。このリストには200〜500のレコードが含まれているはずですが、将来的には10000まで増える可能性があります。すべてのレコードは複雑で、約10個のフィールドが含まれています。

では、パフォーマンスはどうですか?「悪い設計」を使用してリストを1回取得するか、「良いアプローチ」を使用してすべての呼び出しでデータベースからリストを取得する方がよいでしょうか。

4

1 に答える 1

2

では、パフォーマンスはどうですか?「悪い設計」を使用してリストを1回取得するか、「良いアプローチ」を使用してすべての呼び出しでデータベースからリストを取得する方がよいでしょうか。

パフォーマンスと優れたデザインは相互に排他的ではありません。単一のインスタンスを使用する場合の問題は、一度に1つのリクエストしか処理できないことです。したがって、他のすべての要求は、それが完了するのを待っています。

または、キャッシュレイヤーを利用して、クエリの結果をサービスに結合する代わりに保持することもできます。

次に、コードは次のようになります

public IEnumerable<BigDataRecord> GetBigExpensiveQuery(){

   //Double checked locking pattern is necessary to prevent
   // filling the cache multiple times in a multi-threaded
   // environment
   if(Cache["BigQuery"] == null){
      lock(_bigQueryLock){
         if(Cache["BigQuery"] == null){
            var data = DoBigQuery();
            Cache.AddCacheItem(data, TimeSpan.FromSeconds(5));
         }
      }
   }

   return Cache["BigQuery"];

}

これで、すべてが同じキャッシュにアクセスするのに必要な数のインスタンスを持つことができます。

于 2012-10-22T16:00:36.513 に答える