SQLServer2014でのASP.NETセッション管理

SQLServer2014のインメモリOLTPでASP.NETのセッション管理をしてみようというお話です。

ASP.NETのセッションといえば一般的には以下の3つです。

InProcはそのデメリット性ゆえに本番環境で使うことは皆無なので、事実上これは開発用と言っていいかと思います。
開発用といってもシリアライズの事等考えますと開発にすら向いていません。これは絶対使わないので消しちゃっていいと思います。

StateServerはwindowsサービス、SQLServerはDBという違いはありますが、両者ともにシリアライズ可能なオブジェクトのみ格納でき、InProcと違いワーカープロセスのリサイクル等でセッションは破棄されず信頼性も高いという位置づけです。

纏めると3つの差異は以下の通りになります。

モード 管理 メリット デメリット
InProc ASP.NETワーカープロセス Webサーバメモリ上管理のため最速。
Session_OnEndイベントが発生する。
Webアプリケーション、ワーカープロセスのリサイクル等でセッション情報が失われる。
冗長構成にできない
StateServer ASP.NET状態サービス(aspnet_state.exe) Webアプリケーション、ワーカープロセスのリサイクルが発生してもセッションが保護される。
SQLServerよりは高速。
Webサーバと別サーバで動作可能
冗長構成にできない。
SQLServer SQLServer Webアプリケーション、ワーカープロセスのリサイクルが発生してもセッションが保護される。
冗長構成可能。
信頼性が最も高い。
3つの中では最も低速

これ以外のセッション管理モードとしてもうひとつCustomがあります。
https://msdn.microsoft.com/ja-jp/library/ms178587(v=vs.100).aspx

このCustomでSQLServer2014のインメモリでのセッション管理を試してみます。
ネタ元はこちら。
New: ASP.NET Session State Provider for SQL Server In-Memory OLTP - SQL Server Team Blog - Site Home - TechNet Blogs

Microsoft.Web.SessionState.SqlInMemoryをインストール

Nugetでゲットしましょう f:id:ihisa:20150518174327p:plain

ASPStateInMemoryデータベースの作成

インストールが完了するとソリューションエクスプローラの対象プロジェクト直下に[ASPStateInMemory.sql]というファイルが追加されています。
f:id:ihisa:20150518175525p:plain

SQLServer2014上で実行し、セッション管理用のデータベースを作成します。
尚、SQLServer2014のインメモリOLTPを使う為には64bitのEnterprise/Developer/Evaluationの何れかである必要があります。Standardで一回失敗しました(´・ω・`)

f:id:ihisa:20150519112958p:plain

見事作成されました。

web.configのsessionstateを変更

<sessionState mode="Custom" customProvider="SqlInMemoryProvider">
    <providers>
        <add name="SqlInMemoryProvider" type="Microsoft.Web.SessionState.SqlInMemoryProvider" connectionString="data source=sqlserver;initial catalog=ASPStateInMemory;User ID=user;Password=password;" />
    </providers>
</sessionState>

modeをCustomで先ほど作成したASPStateInMemoryデータベースを指定します。

セッションに格納してみる

f:id:ihisa:20150519132726p:plain

デバッグ実行しつつ、SQLServerProfilerで確認するとASPStateInMemory内ストアドプロシージャが呼び出され、テーブルが更新されていることが分かります。

f:id:ihisa:20150519135113p:plain

f:id:ihisa:20150519134835p:plain

時間はInsertOrUpdateStateItemストアドプロシージャ内の通りGETUTCDATE()が設定されています。
タイムアウト時間は20となっていますが、これはASP.NETのデフォルトタイムアウト値ですので、web.configを変更することでタイムアウト時間も変わります。

https://msdn.microsoft.com/ja-jp/library/h6bb9cz9%28v=vs.80%29.aspx

お手軽にインメモリOLTPでセッション管理できました。