現在、Sessionsを使用してページにデータテーブルを保存しているため、同じデータテーブルを何度も取得するためにデータベースをヒットさせる必要はありません。しかし、私の心配は、サーバーのメモリを使用していて、いつか多数のユーザーがログインすると、サーバーの応答が遅くなり、アプリケーションもクラッシュする可能性があることです。
データテーブルをSessionsに保存するのは良い考えですか、それとも毎回DBからデータテーブルを取得する必要がありますか?
一般的な経験則として、セッションは使用しないでください。私は長い間セッションを使用する必要はありませんでした。Webファームの状況セッションに移行するとすぐに、セッションが非常に遅くなるか、非常に複雑になるか、またはその両方になります。
それを回避するかどうかは、実際には、セッションに保存しているデータの量と、セッションのタイムアウト期間内にアクティブになるユーザーの数によって異なります。
現在利用可能なキャッシュとインメモリデータベースのオプションはたくさんありますが、それはより良いオプションかもしれません。最後に、説明した解決策は疑わしいように聞こえますが、実際に問題を測定するまで、既存の解決策を最適化することはしません。
これは、データテーブルに何が格納されているかによって異なります。いずれにせよ、次の理由から、 ASP.NET キャッシュを使用してこれらのデータ テーブルを格納します。
キャッシュには有効期限があります。つまり、スライドまたは絶対有効期限の時間値に基づいて自動的に削除できます。
プロセスのメモリ「プレッシャー」が高すぎる場合、キャッシュは自動的に削除されます。
キーに基づいて、キャッシュされたアイテムを 1 人のユーザーに固有にするか、すべてのユーザーにグローバルにすることができます。
例えば:
// personalized cache item
string personalCacheKey = string.Format("MyDataTable_{0}", (int)Session["UserID"]);
DataTable myPersonalDataTable = (DataTable)Cache[personalCacheKey];
if (myPersonalDataTable == null)
{
myPersonalDataTable = database.dosomething();
Cache.Insert(personalCacheKey, myPersonalDataTable, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // 30 minutes
}
// global (non user specific) cached item
string globalCacheKey = "MyDataTable";
DataTable globalDataTable = (DataTable)Cache[globalCacheKey];
if (globalDataTable == null)
{
globalDataTable = database.dosomething();
Cache.Insert(globalCacheKey, globalDataTable, null, Cache.NoAbsoluteExpiration, new TimeSpan(0, 30, 0)); // 30 minutes (again)
}
ただし、現在の問題は、基になるデータが更新されるかどうか、およびアプリケーションが「古い」キャッシュ データを表示することが許容されるかどうかです。受け入れられない場合は、アイテムをキャッシュから強制的に削除する必要があります。そのためのメカニズムがいくつかあります。
SqlCacheDependency (私が個人的に使用したことはありません) をセットアップするか、 Cache.Remove(cachekey)
.
「一般的に使用される」データをメモリに保存することをお勧めします。それは良い論理です。ただし、「セッション」とは、そのセッション、つまりそのユーザーの存続期間中存在することを意味します。次に、ユーザーの「セッション」が終了するまでの間、すでに述べたように、これはサーバー側の貴重なリソースを消費する可能性があります。
「有効期限」と同じ目的を果たすため、「キャッシュ」オブジェクトの使用を検討することをお勧めします。
DataTable users = new DataTable();
if (Cache["users"] == null)
{
// users = getUsers(customer);
Cache.Add(“users”, users, null, System.Web.Caching.Cache.NoAbsoluteExpiration, new TimeSpan(0, 60, 0), System.Web.Caching.CacheItemPriority.Default, null);
}
else
{
sers = (DataTable)Cache["users"];
}
.NETでメモリを再利用する方法はたくさんあります(1)ViewState(2)キャッシュ(3)セッション(4)Cookie
しかし、私は「キャッシュ」オブジェクトを選びます。
Webサーバーのメモリを増やすことができない場合、明らかな答えは、それをセッション状態で保存せず、毎回データベースから取得することです。
これに伴う問題は、データベースにどのような影響があるかということです。問題をWebサーバーからデータベースサーバーに移動しているだけですか?
データベースをスケールアップ/スケールアウトするよりも、Webサーバーをスケールアウトする方がはるかに簡単です(SQL Serverなどを使用している場合は多くの場合安価です)。
データテーブルのレコード数が少なく、機密データが含まれていない場合は、ViewState も使用できますが、このアプローチではデータをシリアル化してクライアント側に保存し、クライアント側からデータを取得して保存するため、データは小さくする必要があります。サーバー側で。