- PR -

共有変数について

投稿者投稿内容
よっぴー
会議室デビュー日: 2006/10/07
投稿数: 12
投稿日時: 2006-10-07 01:40
いつもお世話になっております。

今回、教えて頂きたい事があります。

ASP.Netでの共有変数についてです。

あるデータを画面内で保持する場合に、基本的にセッション・ViewState等に保持したり
すると思うのですが、わけあってセッション以外にデータを保持する方法は
あるのでしょか?


現在、Protected Shared xx 〜で保持しているのですが
このやり方に何か問題があるのも教えて頂きたい次第でございます。


開発環境:WinXP
     Visual Studio 2003
.NetFramework1.1

よろしくお願い致します。
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2006-10-07 03:51
引用:

よっぴーさんの書き込み (2006-10-07 01:40) より:
あるデータを画面内で保持する場合に、基本的にセッション・ViewState等に保持したり
すると思うのですが、わけあってセッション以外にデータを保持する方法は
あるのでしょか?


どんなわけでしょうか?
セッション・ViewStateなどが用意されているのは、こういったスコープで
データを保持するのに、それなりの仕組みが必要だからです。
あえて使わないわけはなんでしょうか?

Hiddenやクッキーやクエリー等々方法はありますが、ViewStateやセッションより
もっと原始的な扱いになります。

引用:

現在、Protected Shared xx 〜で保持しているのですが
このやり方に何か問題があるのも教えて頂きたい次第でございます。


データをどういうスコープで保持したいかによるわけですが、
画面内と書かれていることから言って問題あるでしょう。
※数人で同時アクセスしてみればおそらく分かるでしょう。
一郎
ぬし
会議室デビュー日: 2002/10/11
投稿数: 1081
投稿日時: 2006-10-07 15:20
静的変数として確保されるメモリ領域は、アプリケーションごとにひとつだけです。
ASP.NETのアプリケーションはサーバーで動いていて、複数のユーザーで共有していますので静的変数の値は全てのユーザーで共有することになります。
Aさんが処理をしている間にBさんも処理をすると、AさんがBさんのデータを使ってしまったりします。

セッションを使わない方法を考えるより、セッションを使えないわけについて考えたほうが良いかと思います。


関係ない話ですけど、ジェネリクス型であれば閉じた生成型(closed constructed type)ごとにひとつの領域が確保されます。
CクラスのXという静的変数があったとすると、
C(Of Integer).X
C(Of String).X
は同じアプリケーションであっても別の変数です。

---
あー、すいません。
VS2003って書いてありますね。
VS2003ではジェネリクス型とかありません。

[ メッセージ編集済み 編集者: 一郎 編集日時 2006-10-07 15:22 ]
よっぴー
会議室デビュー日: 2006/10/07
投稿数: 12
投稿日時: 2006-10-07 19:03
レスありがとうございます。

まず、ViewStateで始めデータを保存していたのですが
データ量が多すぎてレスポンスが悪かったのが1つ

セッションも、大量のデータを管理した場合にレスポンスが遅くならないかという
懸念があったためです。。。

甕星
ぬし
会議室デビュー日: 2003/03/07
投稿数: 1185
お住まい・勤務地: 湖の見える丘の上
投稿日時: 2006-10-07 23:58
引用:

よっぴーさんの書き込み (2006-10-07 19:03) より:
セッションも、大量のデータを管理した場合にレスポンスが遅くならないかという
懸念があったためです。。。


保存したいデータの数が1個の場合と、100個では100個の方がレスポンスは遅くなるでしょう。保存するデータのサイズが1KBの場合と、10MBの場合では10MBのほうが遅くなるでしょう。そんな事は当たり前ですよね。

では、実際にそれが問題になるほどの速度低下として現れるか否かは、仕様を承知している貴方にしか分からない話です。実際のデータ量や、同時接続数などを想定した上で実験する以外に回答を得る手段は無いでしょうね。
囚人
ぬし
会議室デビュー日: 2005/08/13
投稿数: 1019
投稿日時: 2006-10-08 00:17
引用:

現在、Protected Shared xx 〜で保持しているのですが
このやり方に何か問題があるのも教えて頂きたい次第でございます。


リクエストしてくるユーザー毎に違うというならば、静的変数はありえないです。
他の方も仰っている通り、ViewState やセッションとは使い道が違います。

そして、
引用:

まず、ViewStateで始めデータを保存していたのですが
データ量が多すぎてレスポンスが悪かったのが1つ

セッションも、大量のデータを管理した場合にレスポンスが遅くならないかという
懸念があったためです。。。


リクエストしてくるユーザー毎に違うという事はなく、アプリケーション単位で使いまわしてよいというデータならば、毎度データベースから取得してきたらよいのです。(データベース使ってますよね?)
そのキーとなる ID 等のみセッションに保持すれば十分です。

データベースから取れるようなデータを ViewState やセッション、ましてや静的変数等にわざわざ保存する必要はないと思います。

大量というぐらいのデータだから、ユーザーが入力したデータ等ではなく、データベースから取ってきたデータなんですよね?
_________________
囚人のジレンマな日々
まるく
大ベテラン
会議室デビュー日: 2004/01/09
投稿数: 181
投稿日時: 2006-10-08 00:21
甕星さんが指摘されている通り程度問題ですが、「大量のデータを管理した場合」と書き込みがあるので、レスポンス云々よりもアプリケーションプールの強制リサイクルがかかる事の方が課題になるのではないかなぁ、と心配。
よっぴー
会議室デビュー日: 2006/10/07
投稿数: 12
投稿日時: 2006-10-08 01:03
みなさま色々とご指摘ありがとうございます。

指摘いただいた点をもう一度、検討してみたいと思います。

スキルアップ/キャリアアップ(JOB@IT)