書籍転載
独習ASP.NET 第3版

ASP.NETの状態管理:アプリケーション変数/キャッシュ機能
― 第7章 状態管理 7.4/7.5 ―

WINGSプロジェクト 山田 祥寛
2011/08/03
Page1 Page2

本コーナーは、翔泳社発行の書籍『独習ASP.NET 第3版』の中から、特にInsider.NET読者に有用だと考えられる章や個所をInsider.NET編集部が選び、同社の許可を得て転載したものです。基本的に元の文章をそのまま転載していますが、レイアウト上の理由などで文章の記述を変更している部分(例:「上の図」など)や、図の位置などを本サイトのデザインに合わせている部分が若干ありますので、ご了承ください。『独習ASP.NET 第3版』の詳細は「目次情報ページ」や翔泳社のサイトAmazon.co.jpのページをご覧ください。

ご注意:本記事は、雑誌の内容を改変することなく、そのまま転載したものです。このため用字用語の統一ルールなどは@ITのそれとは一致しません。あらかじめご了承ください。

7.4 アプリケーション変数

 アプリケーション変数(アプリケーション状態)とは、アプリケーションを利用するすべてのユーザー間で利用可能なデータです。

 これまでさまざまな状態管理の仕組みを見てきましたが、ここでそれぞれの有効範囲(スコープ)をまとめておきましょう(図7.12)。

図7.12 スコープの概念

 より大きな範囲を持つスコープほど広範囲で情報を共有できますが、長時間持続されるため、アプリケーションに対する負荷も大きくなる可能性があります。

7.4.1 アプリケーション変数の基本

 アプリケーション変数に情報を出し入れする方法は、セッションのそれとほぼ同じです(リスト7.8〜9)。

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  Application.Lock()
  Application("title") = "独習ASP.NET"
  Application.UnLock()
End Sub
リスト7.8 App1.aspx.vb

Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
  lblApp.Text = Application("title")
End Sub
リスト7.9 App2.aspx.vb

 App1.aspxを実行した後、別のブラウザーを開いて、App2.aspxにアクセスしてください。確かにApp1.aspxでセットされたアプリケーション変数が、App2.aspxでも見えていることが確認できるはずです(別のブラウザーを開いているのは、異なる「ユーザー」でアクセスするためです)。

 アプリケーション変数を読み書きするのは、Applicationオブジェクトの役割です。

Application.Lock()
Application(キー名) [=値]
Application.Unlock()
構文 アプリケーション変数の取得/設定

 この節の冒頭で述べたように、アプリケーション変数はアプリケーションを利用しているすべてのユーザーで共有している情報です。値に矛盾が生じないように、アプリケーション変数を設定する場合は、Lockメソッドであらかじめ変数をロックしておくようにしてください。ロックされた変数は、他のセッションからは変更できないようになります。ロックを解除するのは、Unlockメソッドの役割です。

 既存のアプリケーション変数を削除するには、Remove/RemoveAllメソッドを利用します。Removeメソッドは指定された特定のアプリケーション変数を、RemoveAllメソッドは現在保持されているアプリケーション変数全体を、それぞれ破棄します。

Application.Remove("hogehoge")

Application.RemoveAll()

* そもそも頻繁に書き換えが発生するような情報をアプリケーション変数に登録すべきではありません。原則的には、アプリケーション変数はアプリケーション開始時にGlobal.asax(10.4節)のApplication_Startイベントハンドラーで書き込み、個別のページからは読み取りのみ行うのが望ましいでしょう。

7.4.2 [補足]アプリケーション変数の使いどころと制約

 アプリケーション変数は、アプリケーションを利用しているすべてのユーザーが共有しているという性質上、アプリケーション全体でみんなが利用するような基本情報を格納するのに適しています。具体的には、以下のような性質を持ったデータです。

  • 頻繁にアクセスする
  • 読み取り専用である、もしくは滅多に更新しない
  • すべてのユーザーで共通である

 たとえば、テキストファイルで大量のデータを管理しており、これをページごとに読み込んでいるようなケースでは、アプリケーション変数に格納することを検討すべきです。そのうえで、個別のページからはアプリケーション変数を読み込むようにすることで、ファイル読み込みにかかるオーバーヘッドを軽減できます。

 もっとも、アプリケーション変数には以下のような制限もありますので、利用にあたっては注意してください。

制限 複数台のサーバーでは共有できない

 アプリケーション変数は、アプリケーションが動作しているプロセスでのみ共有できます。つまり、アプリケーションが複数のサーバーで稼働している場合、サーバー間で情報は共有できません。

制限 データは揮発性である

 アプリケーション変数は、サーバーメモリで管理されます。よって、サーバーのクラッシュはもちろん、シャットダウン、アップグレード、再起動などによってクリアされます。

制限 メモリの利用量に注意

 と同様の理由から、アプリケーション変数にデータセットなどの巨大なオブジェクトを格納する場合には、サイズに注意すべきです。アプリケーション変数が大きくメモリを占有することは、時として、アプリケーションのパフォーマンスを劣化させる原因にもなるためです。

【エキスパートに訊く】
さまざまな状態管理の手法があることはわかりました。で、結局、どの技術を利用すべきなのでしょうか? 使い分けのポイントを教えてください。

 まずは、有効範囲の観点で選択しましょう。それぞれの技術で、維持される有効範囲が異なります。状態を維持するということは、それだけクライアント/サーバーのリソースを消費するということですから、必要最小限の有効範囲を選択すべきです。有効範囲がほぼ重なっているクッキー、セッションについては、以下のポイントから使い分けを検討してください。

基本はセッションを優先して利用
機密情報を扱う場合はセッションを利用
ブラウザーを閉じた後も情報を維持したい場合はクッキーを利用

 これはクッキーに限ったことではありませんが、機密情報は原則としてクライアント側の管理に委ねるべきではありません。もしもブラウザーを閉じた後も維持すべき情報で、機密情報である場合には、最低でも、プロファイル機能を利用するようにしてください(ただし、そもそもその情報を維持する必要があるのかという検討は必要です)。


【練習問題】7.3
  1. セッション変数、アプリケーション変数、ビューステートを有効範囲の狭い順に並べ替えてください。


 INDEX
  [書籍転載]独習ASP.NET 第3版
  ASP.NETの状態管理:アプリケーション変数/キャッシュ機能
  1.アプリケーション変数
    2.キャッシュ機能

インデックス・ページヘ  「独習ASP.NET 第3版」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間