- PR -

ServletContextの利用について

投稿者投稿内容
TK
常連さん
会議室デビュー日: 2002/08/13
投稿数: 42
投稿日時: 2003-08-27 16:54
TKというものです、よろしくお願いします。
現在、
Tomcat4.0 + struts1.1 + Oracle9i
でWeb Applicationを作成しております。
頻繁に使用するマスターデータを、DBから毎回取得するかわりに
アプリケーションの起動時に一度だけデータベースからデータを取得し
どこかにキャッシュして全JSPから参照するということを考えています。

質問ですが、こういった場合にServletContextを使用するのが妥当であるか
どうかご意見をお聞かせねがえないでしょうか。
もしくは、ほかに有効な方法があればヒントをいただけたらと思います。
データー量としては数十件レベルのものです。
よろしくお願いいたします。

uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-08-27 17:35
>質問ですが、こういった場合にServletContextを使用するのが妥当であるか
どうかご意見をお聞かせねがえないでしょうか。

ServletContextを使用しても可能でしょうが、適当ではないでしょう。

>もしくは、ほかに有効な方法があればヒントをいただけたらと思います。
データー量としては数十件レベルのものです。

よくやるのはXxxCacheといったシングルトンクラスをつくり、そこでデータを管理する
方法です。そのクラスにリロード用のメソッドを設けておくと、後からJSPなどを経由して
データのリロードをオンラインでできるようにできます。
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-08-29 20:45
ほぼ同じ内容の投稿がStruts-User MLであったのですが、同じ方ですか?
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-08-30 10:09
ukさんこんにちは。
引用:

ServletContextを使用しても可能でしょうが、適当ではないでしょう。



適当でない理由をきかせてもらえないでしょうか?
(オンラインでリロードできるかどうかということでしょうか?
ServletContextでもリロードする手段もあると思いますが。)
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2003-08-31 12:31
引用:

Kissingerさんの書き込み (2003-08-30 10:09) より:
適当でない理由をきかせてもらえないでしょうか?



ServletContextに入れるという事は、そのデータを使うところにServletContextを渡すか、
ServletContextからデータを取り出して渡してやる必要がありますよね。それでもよければ
別にいいんですが、柔軟性を考えるとどこからでも呼び出せるようにしておいたほうがいい
でしょう。
(株)ぽち
ぬし
会議室デビュー日: 2002/09/10
投稿数: 376
投稿日時: 2003-09-01 11:13
引用:

ukさんの書き込み (2003-08-31 12:31) より:
ServletContextに入れるという事は、そのデータを使うところにServletContextを渡すか、
ServletContextからデータを取り出して渡してやる必要がありますよね。それでもよければ
別にいいんですが、柔軟性を考えるとどこからでも呼び出せるようにしておいたほうがいい
でしょう。



私も全く同様の考えでSingletonクラスを使用しています。

特にフレームワークを使用する場合、処理を記述するクラスのメソッド
などが固定されていたり(このクラスを継承させた××メソッドに
処理を書いてね等)するので、その中で初期共通情報を使用したい
時にServletContextが扱えないと苦労します。

逆にSingletonにしておけばどこからでもクラスを参照できますから
とっても便利ですね。
Kissinger
ぬし
会議室デビュー日: 2002/04/30
投稿数: 428
お住まい・勤務地: 愛知県
投稿日時: 2003-09-02 01:20
ukさん、(株)ぽちさん回答ありがとうございました。
kito
ベテラン
会議室デビュー日: 2003/03/24
投稿数: 59
お住まい・勤務地: Osaka
投稿日時: 2003-09-02 13:35
引用:

ukさんの書き込み (2003-08-31 12:31) より:
ServletContextに入れるという事は、そのデータを使うところにServletContextを渡すか、
ServletContextからデータを取り出して渡してやる必要がありますよね。それでもよければ
別にいいんですが、柔軟性を考えるとどこからでも呼び出せるようにしておいたほうがいい
でしょう。


全く反対の考えで、
Webアプリケーション単位のキャッシュであればServletContextに
保存する方が良いと考えます。

「どこからでも呼び出せる」というのはつまりグローバル変数と変わらないわけで
確かに一見便利ではありますが、スパゲッティなコードの要因になります。

また、単純なSingletonはクラス単位(ClassLoader単位)でしか管理できないので
例えば、複数のWebApplicationから利用するためにServerのlibディレクトリ
(TomcatだとCATALINA_HOME/common/lib)などに配置すると、Application間でも
共有されてしまい、破綻します。

で、私は以下のようなパターンを良く使います。
Session単位に一つのインスタンスが欲しいときには
public static SessionSingleton getInstance(HttpSession session) {
SessionSingleton ss = (SessionSingleton)session.getAttribute(KEY);
if (ss == null) {
ss = new SessionSingleton();
session.setAttribute(KEY, ss);
}
return ss;
}
//利用側
SessionSingleton singleton = SessionSingleton.getInstance(session);

WebApplication毎に一つのインスタンスを使う場合は
getInstanceの引数をServletContextにします。

こういうのをSingletonというのかどうかはわかりません。
自分以外にこういうパターンをあまり見たことがないのですが、
使っている人はいらっしゃらないんですかね。
なにか問題があるんでしょうか?


[ メッセージ編集済み 編集者: kito 編集日時 2003-09-02 13:42 ]

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