私のコントローラ サーブレット (Tomcat) では、オブジェクトをインスタンス化し、次のようにクラスのプロパティ ( p ) に割り当てました。
public class Controller extends HttpServlet {
String xmlFile = "/tmp/page.xml";
private Pager p = new Pager(xmlFile);
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
.............
私がそのようにした理由は、多くの CPU を集中的に使用するため、一度だけ実行する必要があるインスタンス化によって実行される時間のかかるタスクがあるためです (基本的に、アプリケーションのすべての HTML ページ構造を作成します)。
ここで、永続オブジェクト ( p ) を使用し、次のようにいくつかのメソッドにアクセスします。
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
.................
.................
String name = "xxxxx";
Structure str = p.doAction(name);
..................
}
私の質問は、getPageName()やdoAction( ) などのメソッドによって作成されたオブジェクト、プリミティブなどは、Tomcat がその特定の要求を処理した後にクリーンアップされるのでしょうか? または、 Tomcat の次の再起動/シャットダウンまでメモリを使用し続けますか ( Pagerの永続オブジェクトpと同じ) ?
もう 1 つの重要な質問は、複数の要求がサーブレットによって処理されるため、サーブレットが使用するオブジェクトとプリミティブに問題があるかどうかです (それらのほとんどはメソッドに対してローカルですが、これらの変数の一部はクラスのプロパティを使用します)。このような :
public Structure doAction(String name) {
if ( pages.containsKey(name) ) {// Here pages is a property of this class (a HashMap)
return( new Structure( (Structure)pages.get(name) )); //this creates a "deep copy of this object and sends it back...
}
return( new Structure() );
}//
上記のメソッドが示すように、ページ HashMap は次の形式になります。
page1 => its Structure Object,
page2 => its Structure Ojbect,
..... => .....................,
pageN => its Structure Object
したがって、サーブレットが同時に多くのリクエストを受信した場合、たとえば、特定の時間tにpage2へのN個のリクエストがある場合、 doAction() メソッドからページHashMap にアクセスする際に問題は発生しますか? (これはクラスのプロパティであり、これらのN個のリクエストすべてが同時にアクセスするためです(読み取り専用、書き込みなし))。つまり、「読み取りロック」か何かがありますか?
前もって感謝します。