1

Web アプリケーションの ASP.NET での状態管理に関する記事を数日間読んでいます。このアプリケーションでは、1 人のユーザーがクエリを作成/保存/実行できます。ユーザーがクエリを保存する前に、クエリの各パラメーターを保持する必要があります。
これらのパラメータは文字列値ですが、1 人のユーザーのグローバル サイズは数メガバイトを超える場合があります。私たちは、最大 100 人のユーザーが同時にウェブサイトを運営することを計画しています。

このような状況では、これらの値をインプロセス モードでセッションに保存するのは良くないと思います。

キャッシング メカニズムと AutoSave=true を使用して、ProfileProvider:SqlProfileProvider を既に実装しています。

これらの値をプロファイルまたはセッションに保存するが、SQL データベースに保存する最善の解決策は何ですか?

4

4 に答える 4

1

最適なソリューションは、単一のサーバーを超えて拡張する予定があるかどうかによって異なります。負荷分散された構成では、InProc セッション状態は正しく機能しません (スティッキー セッションを使用しないと、他の問題が発生します)。State Server や SQL Server などのアウト プロセス セッション状態では、ページ アクセスごとに状態情報をシリアル化および逆シリアル化する必要があります。ユーザーごとに複数の MB を使用すると、非常に遅くなる可能性があります。

Dave が提案しているように、キャッシュも別のオプションです。問題の 1 つは、ある Web サーバーから別の Web サーバーへのキャッシュの同期を維持する必要があるかどうかです。

この種の問題に対する通常のアプローチは、データを DB とキャッシュに格納し、本当に必要なページのデータのみを取得することです (すべてのページで読み取られるセッションとは異なります)。次に、SqlDependency または SqlCacheDependency を使用して、DB が変更された場合に複数のサーバーで更新できるようにデータをキャッシュします。

于 2009-11-18T03:39:14.293 に答える
1

1) セッションを (SQL Server 上で) Out Of Proc として保持できるため、問題はそれらをどこに保持するか (メモリ内またはデータベース内) です。メモリに保持すると、最終的には自動的に破棄されます。データベースに保持すると、セッション間でこのデータを使用できます。これらのパラメーターをセッション間で保存する必要があるかどうかを決定します (ユーザーはコンピューターを切り替えることができます。ユーザーは時々アプリケーションを開くことができます) - これらのパラメーターを保持する必要がありますか?

2) 最適化について考える - ユーザーごとに数メガバイトのパラメーター?!? ユーザーが何百ものクエリを持つことができ、次回ユーザーがシステムにログインしたときにそれらを利用できるようにする必要がある場合は、そのすべてをデータベースに保持します。

于 2009-11-17T21:33:24.593 に答える
1

ユーザーの詳細をディスクに保存して、メモリ不足にならないようにすることで、ある程度の成功を収めました。特定の何かが必要な場合は、それをメモリに読み戻す必要があります。これは少し遅くなる可能性がありますが、機能します。

たとえば、一部のオブジェクトをシリアル化し、それらを Web サーバーのハード ドライブ上のファイルに書き込むことができます。セッションID、ユーザー名などに応じてファイルに名前を付けると、必要に応じてファイルを読み書きできます。

于 2009-11-17T21:34:34.967 に答える
1

サーバーのメモリと、それについてどの程度懸念しているかによって異なります。データベースは、データを保存するための同時実行性と安定した方法が優れているため、この種のことには常に適しています。

私のお勧めは、キャッシュされたデータに対してスライド式の有効期限を使用することです。たとえば、10 ~ 20 分程度です。そうすれば、ユーザーが非アクティブになるとセッション データが削除されるため、それほど多くのサーバー リソースを消費することはありません。

有効期限のスライド キャッシングを実行する方法の例 (ここでも参照) については、次のように実行できます。

public static void AddToCache(string key, Object value, int slidingMinutesToExpire)
{
        if (slidingMinutesToExpire == 0)
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, System.Web.Caching.Cache.NoSlidingExpiration, System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
        else
        {
            HttpRuntime.Cache.Insert(key, value, null, System.Web.Caching.Cache.NoAbsoluteExpiration, TimeSpan.FromMinutes(slidingMinutesToExpire), System.Web.Caching.CacheItemPriority.NotRemovable, null);
        }
    }
于 2009-11-17T21:28:33.087 に答える