SQLServer2014のインメモリOLTPでASP.NETのセッション管理をしてみようというお話です。
ASP.NETのセッションといえば一般的には以下の3つです。
- InProc
- StateServer
- SQLServer
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のインメモリでのセッション管理を試してみます。
ネタ元はこちら。
Archived MSDN and TechNet Blogs | Microsoft Docs
Microsoft.Web.SessionState.SqlInMemoryをインストール
Nugetでゲットしましょう
ASPStateInMemoryデータベースの作成
インストールが完了するとソリューションエクスプローラの対象プロジェクト直下に[ASPStateInMemory.sql]というファイルが追加されています。
SQLServer2014上で実行し、セッション管理用のデータベースを作成します。
尚、SQLServer2014のインメモリOLTPを使う為には64bitのEnterprise/Developer/Evaluationの何れかである必要があります。Standardで一回失敗しました(´・ω・`)
見事作成されました。
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データベースを指定します。
セッションに格納してみる
デバッグ実行しつつ、SQLServerProfilerで確認するとASPStateInMemory内ストアドプロシージャが呼び出され、テーブルが更新されていることが分かります。
時間はInsertOrUpdateStateItemストアドプロシージャ内の通りGETUTCDATE()が設定されています。
タイムアウト時間は20となっていますが、これはASP.NETのデフォルトタイムアウト値ですので、web.configを変更することでタイムアウト時間も変わります。
https://msdn.microsoft.com/ja-jp/library/h6bb9cz9%28v=vs.80%29.aspx
お手軽にインメモリOLTPでセッション管理できました。