【ASP.NET】セッション格納方法
ASP.NETではセッションの保持方法として以下の3つがサポートされている。
【InProc】セッション情報をWebサーバーと同マシン上のメモリ内に格納する方式(デフォルト)
■メリット
・3つの方法の中では一番パフォーマンスが良い。
■デメリット
・Webサーバーの障害時、再起動時にセッションの情報が削除されてしまう。
・複数のWebサーバーからにセッション情報を共有できない。
そのため、複数のWebサーバーを並列に繋げて、リクエストごとに別のサーバーに振り分けるような構成にした場合に、セッション情報を引き継ぐことができない。
【StateServer】セッション情報を別サーバーのメモリ内に格納する方式
・外部サーバーの起動コマンド:net start aspnet_state
※ ステートサービスは.NET Frameworkをインストールする際に一緒にインストールされる。
・web.configのsystem.webセクションに以下のような記述が必要。
<sessionState mode="StateServer"
stateConnectionString="tcpip=[サーバー名]:42424"
cookieless="false"
timeout="20/>
■メリット
・Webサーバーの障害時、再起動時であってもセッションの情報が失われない。
■デメリット
・ステートサーバーそれ自体をクラスタリングすることができないため、
ステートサーバーに障害が発生した場合にシステムが稼動できなくなる。
【SQLServer】セッション情報を別サーバーのデータベース内に格納する方式
・InstallSqlState.sql、又はInstallPersistSqlState.sqlを利用して
SQLServerにセッション格納用データベースを作成する必要がある。
(InstallSqlState.sqlの場合はSQLServer再起動時にセッションが削除されてしまう。)
・InstallSqlState.sqlでデータベースを作成した場合には
ASPStateデータベースにはセッション情報を処理するためのストアドが登録され、
実際のセッションの値はtempdbデータベースに格納される。
・web.configのsystem.webセクションに以下のような記述が必要。
<sessionState mode="SQLServer"
sqlConnectionString="data source=127.0.0.1;user
id=
cookieless="false"
timeout="20"
/>
■メリット
・Webサーバーの障害時、再起動時であってもセッションの情報が失われない。
・DBサーバーを冗長構成にしておけば、1つのDBサーバーに障害が発生した場合でも
もう一方のDBサーバーで稼動を続けることができる。
■デメリット
・InProcに比べれば処理速度が遅い(ただし、セッションサイズに大きなデータを格納しなければ問題ない場合も多い)
【その他の注意点】
※StateServerとSQLServerモードではシリアライズ可能なオブジェクトしかセッションに格納することができない。(シリアライズ不可のオブジェクトを格納すると実行時エラーとなる。)
本番でStateServer又はSQLServerモードにするのであれば、開発時はStateServerモードにしておくこと。(InProcモードではシリアライズ不可のオブジェクトを格納してもOKなので、開発者が気づきにくい。)
※.NETに限らずですが、セッション情報はサーバー内に格納されるため、サイズの大きいオブジェクトを格納するとパフォーマンスの低下につながってしまう。
(クライアントはクッキー情報にセッションIDを持っているだけ。)
セッションのサイズをチェックできる仕掛けを共通機能として組み込んであげると良いですね。
【参考文献】
(書籍).NET エンタープライズWebアプリケーション開発技術大全 Vol.3
[HOWTO]SQL ServerでASP.NETセッション状態管理を構成する方法
http://support.microsoft.com/kb/317604/ja