2009-04-02 9 views
3

私は大規模なアプリケーションを構築しています。私は一般的にはプライベートなグローバルな情報を格納するためにシンプルなセッションを使用しますが、アプリケーションがかなり大きくなる可能性があります。それが持つことができるメモリセッションの量。ASP.NETグローバル変数を格納する - すべてのページからアクセス可能

このような変数を格納する方法はありますか?

たとえば、ユーザーがログインすると、毎回データベースを照会することなく、そのユーザーに関するデータを保存し、必要な場所に表示したいと考えています。

答えて

3

セッションはここに移動する方法であり、現在のセッションに関する情報を要求間で保持するためのものです。 ASP.NETフレームワークには、この目的を持つ他のオブジェクトはありません。

キャッシュを使用するか、アプリケーションコレクションに格納することができますが、個々のセッションデータを一意に識別する責任はあなた次第です。

セッションが終了し、それらのコレクション(キャッシュまたはアプリケーション)に格納されているインスタンスを解放するときには、どのような処理が必要ですか。

「考える」と思われることに基づいてこれらの質問をするのは、本当に悪い考えです。これは時期尚早の最適化の一形態であり、避けてください。むしろ、この目的のために意図されているようにセッションを使用し、テスト時にパフォーマンスが問題になる場合は、ボトルネックがどこにあるかを測定し、対処してください。

3

使用クッキー - 彼らは

他のオプションが含まかかわらず、あなたの負荷分散環境での作業になります - あなたは、セッション状態を構成するために、あなたのasp.netアプリを設定することができ

1)SQLデータベースにあなたのsessionvaluesを書きますSQL Serverを使用する - しかし、これはセッションがタイムアウトしないように独自の問題があります(コードで明示的に処理する必要があります)

2)SQL Serverを使用していない場合は基本的に問題が発生しますユーザーはWebサーバーにロードバランシングを実装するため、ユーザーは別のWebサイトにアクセスできます同一セッション内のサーバー(およびそれが動作しないでしょう)

このため周りの仕事があまりにもそこにある - その呼ばSTICKY SESSIONS - Webサーバーがユーザーを保証し、常にセッション内

を同じWebサーバーを打つだろう

3).net 2.0プロバイダーモデルでは、デリゲートを実装して独自のセッションストレージプロバイダーを作成することもできます。そのため、Webサーバー/共有サーバーに独自のxmlファイルを作成してそこでセッションデータを読み書きできます:

これを解決する方法はたくさんあります。最も単純で費用対効果の高いソリューションは、クッキーを使用することです。

1

キャッシュを使用することがあります。これは、メモリが不足しているときに解放するためのメカニズムを内蔵しています...

+0

クライアントのCookie設定に依存しません – annakata

0

あなたのデータがセッションには大きすぎると思うなら、私はあなたが不必要ではないようにキャッシュを使って何らかの種類のデータベースを考えますコール。

0

保存するユーザーセッションごとのデータである場合は、ASP.NETセッションを使用することが最良の方法です。メモリ使用量を最も心配している場合は、MSSQLモードを使用できます。データはどこかに存在しなければならず、使用するセッションモードの選択は、ユーザーの環境とユーザーの使用パターンに依存します。

0

このような問題が発生し解決するまで、セッション状態のサイズに問題があると想定しないでください。たとえば、アプリケーション全体で大量のセッション状態を使用することもありますが、任意のユーザーがセッション中にそれをあまり使用しない可能性があります。

デフォルトのセッション状態プロバイダからSQLプロバイダまたは状態サーバープロバイダに変更するとメモリの問題が緩和される可能性もあります。

キャッシュは使用できますが、キャッシュはアプリケーション全体に適用されます。ユーザーIDまたはセッションID:Cache[userID + ".MyCacheEntry"]でキャッシュエントリを修飾する必要があります。

このデータを格納するために静的変数を使用しないでください。あなたの件名で示唆されているように、ユーザー単位ではなくアプリケーション全体に適用されます。

1

確かにこれのためにクッキーを使用してください。最善の方法は、あなた自身のためにすべての重労働を行うクッキーラッパークラスにすることです。クッキーがヌルかどうかを確認したり、httpcontextにアクセスしたりしてください。クッキーを.csまたは.vbにすべて抽象化してください。

SetCookieValue(someValue, cookieName); //there will be some expiration concerns here as well 

myValue = GetCookieValue(cookieName); 

Christian Weiss has a good strategy

関連する問題