Cache と ReportDocument オブジェクト モデルの永続
Cache は、状況の永続のために ASP .NET で使用される、サーバー ベースのアプローチです。Cache は、ASP と ASP.NET の Application オブジェクトと機能的に類似しています。
- Application によって、アプリケーション スコープ全体のあらゆるオブジェクトを永続できます。
- アプリケーションは、ユーザー特有の情報を保存するようには設計されていません。
Cache はこうしたすべての機能を Application と共有しますが、一時データの管理用に新しい情報レベルを追加します。
- キャッシュに追加されるオブジェクトは、ファイル ベース、キー ベース、または時間ベースの依存性と共に設定されます。関連するファイルまたはキーに関する変更があった場合、または一定の時間が経過した場合、オブジェクトは自動的にキャッシュから削除されます。そして、次回オブジェクトが必要な時に、更新されたバージョンがキャッシュに置かれるようになります。
- 依存性なしでキャッシュに追加されるオブジェクトは、利用されないと自動的に無効となります。
- オブジェクトがキャッシュから削除されると、イベントが引き起こされます。イベントを実行してオブジェクトの更新されたバージョンを Cache にロードするよう、コードを書くことができます。
オリジナルのキー文字列によってオブジェクトの代替バージョンが追加されると、それまでのバージョンが上書きされます。上書きを避けるため、代替定義とキー文字列を連動させ、それぞれのオブジェクトの代替バージョンが個別になるようにします。
Application より Cache が優れている点は、すべてのユーザーがアクセス可能な情報を保存するのは Application でも可能ですが、Cache では依存性の変更に基づいて、それ自体の情報を更新できることです。
.NET 2.0 Framework のキャッシュの動作
.NET 2.0 Framework のキャッシュは、ユーザーごと、およびセッションごとに処理されるため、効率的で安全です。
したがって、ユーザーがレポートを表示すると、レポートのコピーがキャッシュに保存されて、そのユーザーに表示されます。現在のセッションがアクティブである間にレポートを再度表示すると、アプリケーションはキャッシュに保存されたレポートを表示します。そのため、同じユーザーがレポートを表示するたびにレポートを実行する必要がありません。他のユーザーがログオンして同じレポートを開くと、アプリケーションはレポートを実行し、レポートの 2 つ目のコピーがキャッシュに保存されてユーザーに表示されます。つまり、すべてのユーザーが自身のセッションで、レポートのコピーをキャッシュに保存することになります。そのため、複数のユーザーが同じレポートを共有することはありません。
この永続アプローチの制限
Cache にあまり詳しくない開発者は、Session の代わりとして Cacheをどんな永続にも適用しようと考えがちです。しかし、Cache は Session オブジェクトの機能の代わりとしては設計されていません。Session の独自性を再現しようとして、ユーザー特有のデータを Cache キーに関連付け、Cache をユーザー オブジェクトにロードしたとします。しかし、Session と異なり、Cache はユーザーのタイムアウト後も無効になりません。その結果、Cache は Web サーバー メモリに Session オブジェクトよりも大きな負担を強いることになります。
ユーザー特有のデータを永続する必要がある場合は、Session オブジェクトの使用を継続してください。
代わりとなる永続アプローチは、次のとおりです。
Cache を使用した ReportDocument オブジェクト モデルの永続化
レポートが ReportDocument オブジェクト モデルにカプセル化されている場合は、ReportDocument オブジェクト モデルを Session や Cache などのサーバー ベースのアプローチで永続する必要があります。
Cache を使用すると、ReportDocument オブジェクト モデル内でレポートを永続することができます。それには、次の 2 つの方法のうち 1 つを使用します。
- レポートをインスタンス化し、Cache オブジェクトに割り当てます。その際、レポートを Session オブジェクトに割り当てたのと同じ構文を使用します。
この方法が機能するのは、レポートを共有する必要性が高い場合のみです。その場合、ReportDocument インスタンスの発生は 1 回だけで、パラメータとログオン認証のセットを 1 つ使用します。ReportDocument インスタンスは、パラメータとログオン情報の違いによって何度も発生する可能性があります。同じキー文字列を使ってその情報が Cache オブジェクトに再度割り当てられた結果、ReportDocument インスタンスの前のバージョンが上書きされます。
- ICachedReport インターフェイスを実装するレポート クラスのバージョンをインスタンス化します。
Crystal Reports SDK には、レポートのビルトイン キャッシュ フレームワークが含まれています。ICachedReport インターフェイスを実装するあらゆるレポートは、パラメータとユーザーのログオン認証に基づく固有のキーと共に、キャッシュへ自動的に追加されます。この方法は、レポートを共有する必要性が高いすべてのレポートで機能しますが、パラメータとログオン認証の多少の違いにより、いくつかのバージョンが発生する可能性があります。レポートを共有する必要性が低い場合は(ユーザー特有のレポートなど)、代わりに Session オブジェクトに割り当てます。
IcachedReport を実装した埋め込みレポートを永続する
- レポートをプロジェクトに追加します。
これにより、埋め込みレポート クラスが作成されます。また、ロードするキャッシュ レポート クラスも作成され、埋め込みレポート クラスのキャッシュされたインスタンスが返されます。
キャッシュ レポート クラスをインスタンス化します。
このキャッシュ クラス インスタンスを CrystalReportViewer コントロールに割り当てます。
<table>
<colgroup>
<col style="width: 100%" />
</colgroup>
<thead>
<tr class="header">
<th><img src="images/w5dk7atd.alert_note(ja-jp,VS.90).gif" title="Note" alt="Note" class="note" />注</th>
</tr>
</thead>
<tbody>
<tr class="odd">
<td><p>この手順に関する詳細な例は、<a href="ms227391(v=vs.90).md">「 キャッシュされた埋め込みレポート クラスへのバインド 」</a>を参照してください。</p></td>
</tr>
</tbody>
</table>
IcachedReport を実装するユーティリティ クラスにより埋め込みでないレポートを永続する
- ユーザー自身のキャッシュ管理ユーティリティ クラスを作成し、IcachedReport を実装するよう設定します。
- このユーティリティ クラスで、ReportDocument.Load() メソッドを使用してパス文字列から埋め込みでないレポートをロードします。
- 実装メソッド CreateReport() をコード化し、埋め込みでないレポートの ReportDocument インスタンスを返すようにします。
- レポート キャッシュ管理ユーティリティ クラスをインスタンス化します。
- このクラス インスタンスを CrystalReportViewer コントロールに割り当てます。
注
この手順に関する詳細な例は、「キャッシュ管理ユーティリティ クラスにロードされる埋め込みでない Report クラスへのバインド」を参照してください。
Cache を使った ReportDocument オブジェクト モデルの永続の制限
ユーザー間での高度な共有性を持つ ReportDocument インスタンスを永続する際に、Cache は最適なアプローチです。しかし、レポートがユーザー特有である場合、Cache はサーバーのメモリを消耗します。ユーザー ベースのインスタンスがアプリケーション レベルで作成され、ユーザーの作業が終了してもサーバーのメモリにインスタンスが残るためです。ユーザー特有のレポートには Session を割り当てるようにしてください。
![]() |
---|
多くの場合、Session を使用して ReportDocument インスタンスを永続します。Cache、またはより具体的に言えば ICachedReport インターフェイスを使用するのは、レポートの共有性が高く、レポートの量が膨大な場合、または複雑でデータの取得に時間がかかる場合だけにします。 |
Cache と Viewstate との比較
Cache の主な機能は、分離コード クラスでオブジェクトの状況を永続することです。ViewState の主な機能は、Web ページでコントロールの状態を永続することです。Web ページ上のコントロールが分離コード クラスのオブジェクトにバインドされ、ページが再ロードされる際にどちらも永続する必要がある場合は、Cache と ViewState は永続の役割を共有します。
この場合、ViewState は CrystalReportViewer コントロールを永続し、Cache はコントロールにバインドされる ReportDocument を永続します。