0

私のコントローラ サーブレット (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個のリクエストすべてが同時にアクセスするためです(読み取り専用、書き込みなし))。つまり、「読み取りロック」か何かがありますか?

前もって感謝します。

4

1 に答える 1

1

getPageName() や doAction() などのメソッドによって作成されたオブジェクト、プリミティブなどは、Tomcat がその特定の要求を処理した後にクリーンアップされますか?

場合によります。これらのオブジェクト/プリミティブが によって直接的または間接的に参照されるp場合、それらは次のリクエストのために保持されます (推移的に到達可能という用語は、この関係を定義するために時々使用されます)。これらのオブジェクトが推移的に到達可能でない場合、それらはなくなり、GC によって収集されます。

複数のリクエストがサーブレットによって処理されるため、サーブレットが使用するオブジェクトとプリミティブに問題はありますか (それらのほとんどはメソッドに対してローカルですが、これらの変数の一部はクラスのプロパティを使用します)<..> ?

メソッド ローカル オブジェクト (他の場所で参照されていない場合) はスレッド セーフであり、問​​題は発生しません。クラスのプロパティは通常、変更されることはなく、変更しない限り (とにかく変な考えです)、問題ないはずです。

サーブレットが同時に多くのリクエストを受信した場合、ページへのアクセスに問題はありますか HashMap

詳細については、この SO 投稿を参照してください。簡単な答えは、「マップを変更しなければ問題ない可能性が高いですが、そのようなシナリオ用に設計されたImmutableMapを使用することを強くお勧めします」です。

于 2012-12-14T21:53:55.173 に答える