- PR -

Servletクラスを複数個インスタンス化する弊害

1
投稿者投稿内容
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-11-19 23:37
現在Tomcat5.5 とServletを利用したWebアプリケーションを作成しています。
web.xmlで、servlet-name値は異なるけれど、servlet-class値は同一のモノを指した場合、
どうなるのかと思い、以下のように記述して実行してみました。

<servlet>
 <servlet-name>ServletA</servlet-name>
 <servlet-class>hoge.Servlet</servlet-class>
 <init-param>
  <param-name>command</param-name>
  <param-value>hoge.Foo</param-value>
 </init-param>
</servlet>
<servlet-mapping>
 <servlet-name>ServletA</servlet-name>
 <url-pattern>/page1</url-pattern>
</servlet-mapping>

<servlet>
 <servlet-name>ServletB</servlet-name>
 <servlet-class>hoge.Servlet</servlet-class>
 <init-param>
  <param-name>command</param-name>
  <param-value>hoge.Bar</param-value>
 </init-param>
</servlet>
<servlet-mapping>
 <servlet-name>ServletB</servlet-name>
 <url-pattern>/page2</url-pattern>
</servlet-mapping>

こうすると、hoge.Servletクラスのコンストラクターが2度呼び出され、
hoge.Servletのインスタンスが複数システムに存在することになってしまいます。

Servlet自体はスレッドとして実行されると聞いた覚えがあるのですが、
同じServletクラスのインスタンスが複数個システムに存在することで、
システムに弊害が起きることはあるのでしょうか?
かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-11-20 00:16
弊害が発生するように作れば発生しますし、
発生しないように作れば発生しません。
作り次第としか言いようがありません。

弊害というより、サーブレットコンテナの仕様を知らずに作ったことによる、
単なるバグという性格の方が強いでしょう。

心配されているようですが、逆にどんな事態が発生するとお考えですか?

引用:

こうすると、hoge.Servletクラスのコンストラクターが2度呼び出され、
hoge.Servletのインスタンスが複数システムに存在することになってしまいます。

Servlet自体はスレッドとして実行されると聞いた覚えがあるのですが、
同じServletクラスのインスタンスが複数個システムに存在することで、
システムに弊害が起きることはあるのでしょうか?


言葉の使い方がよくないので指摘すると、
・システム→
  コンテキスト
・Servlet自体はスレッドとして実行されると→
  サーブレットのインスタンスはマルチスレッドで実行される
です。
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-11-20 00:17
普通にサーブレットを作っている限り特に問題はないです。
パラメータを変えてデプロイしたい場合は複数定義する、という方向で良いでしょう。
Ier
常連さん
会議室デビュー日: 2006/02/23
投稿数: 33
投稿日時: 2007-11-20 01:09
返信ありがとうございます。

>かつのりさん
マルチスレッドプログラミングとサーブレットコンテナの仕様は勉強し始めたばかりなので、
このような使い方が根本的に間違っているのかどうか心配になり、質問させていただきました。

あと、言葉のご指摘ありがとうございます。
以後気を付けたいと思いますm(_ _)m

>インギさん
アドバイスありがとうございます。
nagise
ぬし
会議室デビュー日: 2006/05/19
投稿数: 1141
投稿日時: 2007-11-20 01:20
場合によっては意図的に、初期化のパラメータ(web.xmlのinit-param)を変えて
同じclassのServletを別URLで複数立ち上げることもあるでしょう。
使い方次第では毒にも薬にもなります。
1

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