- PR -

Webアプリケーション実行時のサーバ変数の持ち方について

投稿者投稿内容
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-05-31 09:52
いつも勉強させていただいております。

抽象的な話で申し訳ないのですが、現在ASP.NETの
Webアプリを開発しておりますが、クラインアント
がページにアクセスする際の変数の持ち方について
質問があります。

クライアント毎に異なる情報をDBから取得したデータ
をA.aspxと表示しようとします。
その際に、DBからデータを取得し、整形するクラスファイルを
別途B.classとしこの中に配列も宣言しておきます。
そして、A.aspxにおいて、B.配列名をコントロールに
バインドして表示します。

ここで疑問なのですが、共通クラスB.classに配列を
もたせても良いものなのでしょうか?
A.aspxでは描画処理時に呼び出すだけなのですが、
多数のクラインアントがアクセスした際に、配列の
値があるタイミングで変わったりするものでしょうか?

また、このような現象を回避する為にはA.aspx内に
配列を宣言し、処理するべきなのでしょうか?

非常に素人のような質問で申し訳ないのですが、Web
アプリは予想外のことが多くて困ってます。
質問も、めちゃくちゃで申し訳ありませんが、何か
ご存知の方いらっしゃいましたら、ご教授よろしく
お願いします。

ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-31 10:10
共通なBクラスの位置づけが良く分かりませんが……。

引用:

ターキッシュさんの書き込み (2004-05-31 09:52) より:

A.aspxでは描画処理時に呼び出すだけなのですが、
多数のクラインアントがアクセスした際に、配列の
値があるタイミングで変わったりするものでしょうか?


もしも、Bクラスに保持する配列がstaticな定義だとしたら、当然変わります。
それとも、Bクラスに配列を格納(static定義でないもの)し、そのBクラス自体をSessionとかに入れるなら、変わらないでしょう。
引用:

クライアント毎に異なる情報をDBから取得したデータ
をA.aspxと表示しようとします。


な目的ですから、
引用:

ここで疑問なのですが、共通クラスB.classに配列を
もたせても良いものなのでしょうか?


Sessionとかを使っていないとしたら、良くないでしょう。不可能とまでは言いませんが……。
Sessionとかの状態管理を使うべきだと思います。
Webアプリケーションの状態管理」の、「表1 状態管理のいくつかの方法」を参照してください。

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-31 10:22 ]

[ メッセージ編集済み 編集者: ぢゃん♪ 編集日時 2004-05-31 10:24 ]
なちゃ
ぬし
会議室デビュー日: 2003/06/11
投稿数: 872
投稿日時: 2004-05-31 10:34
一応補足です。
引用:

ぢゃん♪さんの書き込み (2004-05-31 10:10) より:
Sessionとかを使っていないとしたら、良くないでしょう。不可能とまでは言いませんが……。
Sessionとかの状態管理を使うべきだと思います。


その場で読み出すデータであれば、その場でインスタンスを作ればそれでよいでしょう。
※ぢゃん♪さんの仰るように、インスタンス変数として持たせた場合の話です。

読み出したデータを、クライアント毎にセッション有効中は保持しておく必要があるのなら、Sessionを使うべきでしょう。
一休
常連さん
会議室デビュー日: 2003/11/26
投稿数: 20
投稿日時: 2004-05-31 10:36
引用:
その際に、DBからデータを取得し、整形するクラスファイルを
別途B.classとしこの中に配列も宣言しておきます。
そして、A.aspxにおいて、B.配列名をコントロールに
バインドして表示します。


とある事から、A.aspxのコード内でBクラスをインスタンス化して
利用(データ取得メソッドの呼び出しなど)しているのかな?と推測しています。

であれば、ぢゃん♪さんの仰るように「staticな変数でない限り」
クライアントからのアクセスがあるたびにBのインスタンスが生成され、
各インスタンスがそれぞれ配列を保持しているので
値が書き換えられたりすることはありません。

なちゃさんとかぶってしまいました^^;

[ メッセージ編集済み 編集者: 一休 編集日時 2004-05-31 10:38 ]
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-05-31 10:57
ぢゃん♪様、なちゃ様、一休様ご返答ありがとうございます。

抽象的な質問にも関わらずお答えいただきありがとうございました。
static宣言時には間違いなくこのような動きになりましたので、
現在はpublicで宣言しております。

具体的には、
Bクラス内では、public string[] LIST=new string[10];
と宣言して、DBのデータを取得する関数(DB_get)が呼ばれた際に
LISTにデータが入るようにしてあります。

A.aspx内で
Bクラス名 Bclass=new Bクラス名();
とし、A.aspx内のある関数内で、

B.DB_get();
B.LISTをコントロールにバインドする処理;

のように使用しています。
他の関数にまたがることはありません。

このような処理では、問題無いものでしょうか?
よろしくご教授お願いします。
ぢゃん♪
大ベテラン
会議室デビュー日: 2003/06/12
投稿数: 208
お住まい・勤務地: 都内
投稿日時: 2004-05-31 11:04
引用:

ターキッシュさんの書き込み (2004-05-31 10:57) より:

現在はpublicで宣言しております。
         :
        (中略)
         :
他の関数にまたがることはありません。

このような処理では、問題無いものでしょうか?


それでしたら、問題ないと思います。
ターキッシュ
大ベテラン
会議室デビュー日: 2003/01/15
投稿数: 126
投稿日時: 2004-05-31 14:14
ぢゃん♪様ご返答ありがとうございます。

何とか悩みも振り切れました。
今後もご教授よろしくお願いします。

Jitta
ぬし
会議室デビュー日: 2002/07/05
投稿数: 6267
お住まい・勤務地: 兵庫県・海手
投稿日時: 2004-05-31 15:35
 えっと、ASP.NETワーカプロセスは、デフォルトではメモリの60%に相当するメモリを確保すると、リスタートします。プロセスが再起動するので、他のプロセスに保管しているセッション情報以外はすべて消えます。

 この点はご注意。

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