- - PR -
ServletContextの利用について
| 投稿者 | 投稿内容 | ||||
|---|---|---|---|---|---|
|
投稿日時: 2003-08-27 16:54
TKというものです、よろしくお願いします。
現在、 Tomcat4.0 + struts1.1 + Oracle9i でWeb Applicationを作成しております。 頻繁に使用するマスターデータを、DBから毎回取得するかわりに アプリケーションの起動時に一度だけデータベースからデータを取得し どこかにキャッシュして全JSPから参照するということを考えています。 質問ですが、こういった場合にServletContextを使用するのが妥当であるか どうかご意見をお聞かせねがえないでしょうか。 もしくは、ほかに有効な方法があればヒントをいただけたらと思います。 データー量としては数十件レベルのものです。 よろしくお願いいたします。 | ||||
|
投稿日時: 2003-08-27 17:35
>質問ですが、こういった場合にServletContextを使用するのが妥当であるか
どうかご意見をお聞かせねがえないでしょうか。 ServletContextを使用しても可能でしょうが、適当ではないでしょう。 >もしくは、ほかに有効な方法があればヒントをいただけたらと思います。 データー量としては数十件レベルのものです。 よくやるのはXxxCacheといったシングルトンクラスをつくり、そこでデータを管理する 方法です。そのクラスにリロード用のメソッドを設けておくと、後からJSPなどを経由して データのリロードをオンラインでできるようにできます。 | ||||
|
投稿日時: 2003-08-29 20:45
ほぼ同じ内容の投稿がStruts-User MLであったのですが、同じ方ですか?
| ||||
|
投稿日時: 2003-08-30 10:09
ukさんこんにちは。
適当でない理由をきかせてもらえないでしょうか? (オンラインでリロードできるかどうかということでしょうか? ServletContextでもリロードする手段もあると思いますが。) | ||||
|
投稿日時: 2003-08-31 12:31
ServletContextに入れるという事は、そのデータを使うところにServletContextを渡すか、 ServletContextからデータを取り出して渡してやる必要がありますよね。それでもよければ 別にいいんですが、柔軟性を考えるとどこからでも呼び出せるようにしておいたほうがいい でしょう。 | ||||
|
投稿日時: 2003-09-01 11:13
私も全く同様の考えでSingletonクラスを使用しています。 特にフレームワークを使用する場合、処理を記述するクラスのメソッド などが固定されていたり(このクラスを継承させた××メソッドに 処理を書いてね等)するので、その中で初期共通情報を使用したい 時にServletContextが扱えないと苦労します。 逆にSingletonにしておけばどこからでもクラスを参照できますから とっても便利ですね。 | ||||
|
投稿日時: 2003-09-02 01:20
ukさん、(株)ぽちさん回答ありがとうございました。
| ||||
|
投稿日時: 2003-09-02 13:35
全く反対の考えで、 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 ] | ||||
