- PR -

Webアプリケーションで唯一の変数を作成するには?

投稿者投稿内容
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-29 11:49
Webアプリケーションで唯一の変数(boolean)を
作成したいのですがシングルトンクラスを作成して
そこのフィールドとして持たすすべきでしょうか?

あるいは
単純にあるクラスのstatic変数とした場合はどうなるでしょうか?
(あるクラスとははリクエスト毎に生成され保持されないオブジェクト)

static変数にした場合のテストを行ったのですが
複数のセッションに対しても共通の変数として使用できています。
ただ、これはまだGCがstatic変数を持っているクラスに対して
動いていないからで、GCのタイミングでこのstatic変数はなくなってしまいますでしょうか?

尚、作成するプログラムの制約上applicationスコープへのオブジェクトの設定はできません。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2005-07-29 12:22
インスタンスがすべてガベージコレクションで改修されてもクラスがアンロードされない限り static 変数の内容は保持されま。つまり Web アプリケーションやサーブレットの再ロードなどしない限り値は消えないものと思っていいでしょう。
なので static 変数を用いる戦略もアリかと思います。
#クラスタ化はできませんが
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-07-29 12:38
JNDIに、そのデータを格納しておくオブジェクトを一個だけぶら下げておいて、共有するという手もありますよ。

Applicationスコープに格納できない制約って、なにによるものなのでしょうか?
その制約をはずすことが可能なら、一番よいとおもうので…

たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-29 12:43
ご返信ありがとうございます。

>なので static 変数を用いる戦略もアリかと思います。
なんと、static変数でもできてしまうんですね。

>#クラスタ化はできませんが
今回はクラスタ化も考慮しないといけないので
static変数だとダメですね。
(ちょっと調べたところstatic変数はシリアライズ化されないからかな)
ちなみにstatic変数を使用してクラスタ化するとどう動くんでしょう?

サーバー間で変数が共通化されず、再度初期状態に戻るという認識でいいでしょうか?
また、Singletonの場合は、クラスタ化した場合でも
問題なく動くでしょうか?
その場合に
・シングルトンクラスにimplements Serializableをつけないといけない
・シングルトンに保持する変数にstaticをつけてはいけない
など制約がありますでしょうか?

質問攻めで申し訳ないです。ちょっと混乱してきました。
Anthyhime
ぬし
会議室デビュー日: 2002/09/10
投稿数: 437
投稿日時: 2005-07-29 12:54
引用:

また、Singletonの場合は、クラスタ化した場合でも
問題なく動くでしょうか?


動きません。クラスローダー単位でSingletonがそれぞれ作成されてしまいます。

クラスタ環境のサーバー間で変数を共通化したいのであればRDBMSを利用するのが良いと思います。
その他の方法ではアトミックに変数を読み書きできることはなかなか保障できないでしょう。
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-29 13:07
>クラスタ環境のサーバー間で変数を共通化したいのであればRDBMSを利用するのが良いと思います。
DBという手もありましたね。考えてませんでした。
しかし、今回は制約上使用できないのです。
(理由は、作成しているものはいろいろなプロジェクトで使用するライブラリなもので
作成した変数はライブラリ使用者から変更されてはいけないオブジェクトだからです。
applicationスコープに格納できない理由も、引数としてContextを受け取っていないから
格納するときのID等の問題です)

ところで、static変数にしろ、Singletonを使ったにしろ
初期化は1回のみでしょうか?
作成したい変数(boolean)は、重い処理を1回だけ行いたいために使用する予定です。
重い処理を1回やったら変数(boolean)をtrueにしてもうやらない。という使い方です。
なので、クラスタ化してもサーバー毎(クラスローダー単位?)に、この重い処理が1回しか走らないのであれば
これでOKです。
この認識で正しいでしょうか?
シュン
ぬし
会議室デビュー日: 2004/01/06
投稿数: 328
お住まい・勤務地: 東京都
投稿日時: 2005-07-29 15:03
質問の趣旨からは外れますが、そういう目的なら、たとえば
ServletContextLisneter等のイベントハンドラが使用できませんか?
たけ
常連さん
会議室デビュー日: 2005/01/07
投稿数: 20
投稿日時: 2005-07-29 15:51
>ServletContextLisneter等のイベントハンドラが使用できませんか?
その手もありますね。
でも今回はweb.xmlへの記述を強制したくないのと、行いたい処理にライブラリを
呼び出したときの引数を必要とするので要件を満たせません。

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