19

リンクhttp://www.xyzws.com/Servletfaq/when-is-destroy-of-servlets-called/20に従って、 destroy メソッドを呼び出す理由の 1 つは、サーブレットがリクエストを取得していない場合です。長い間

長い間呼び出されないページがあるのではないかと考えていました。では、destroy が呼び出されて使用されなくなるということですか?

実際、インタビューでこの質問をされたのですが、destroy メソッドはサーバーがシャットダウンされたときにのみ呼び出されるとのことでした。

これに関する助けに感謝します。

4

8 に答える 8

10

私の知る限り、

Javaサーブレットでdestroy()は、プログラマーによって呼び出されることは想定されていません。ただし、呼び出されると実行されます。暗黙の質問は、サーブレットが破壊されるかどうかです。いいえ、それはしません。destroy()メソッドは、Javaサーブレットを破棄することは想定されておらず、破棄されません。

Javaサーブレットでの意味はdestroy()、コンテナがサーブレットを破棄することを決定する直前にコンテンツが実行されるということです。ただし、自分でメソッドを呼び出すdestroy()と、コンテンツが実行されてから、それぞれのプロセスが続行されます。この質問にそれぞれ対応して、destroy()が実行され、サーブレットの初期化が完了します。

destroy()最初にメソッドが呼び出され、次にサーブレットがコンテナから削除され、最終的にガベージコレクションが行われます。destroy()メソッドには通常、ガベージコレクションされないJDBC接続などのリソースを解放するためのコードが含まれています。

于 2013-03-19T05:39:23.003 に答える
5

いくつかのケース:

  1. コンテナーがシャットダウンしたとき、またはアプリケーションがシャットダウンしたとき。
  2. コンテナがメモリ不足と判断したとき。
  3. このサーブレットが長い間リクエストを受けていない場合。

Docによると

サーブレットがサービスを停止していることをサーブレットに示すために、サーブレット コンテナーによって呼び出されます。このメソッドは、サーブレットのサービス メソッド内のすべてのスレッドが終了した後、またはタイムアウト期間が経過した後にのみ呼び出されます。サーブレット コンテナがこのメソッドを呼び出した後、このサーブレットでサービス メソッドを再度呼び出すことはありません。

于 2014-11-19T12:48:25.183 に答える
3

仕様から(The Servlet Interface -> Servlet Life Cycle -> End of Service):

サーブレットインスタンスでdestroyメソッドが呼び出されると、コンテナは他のリクエストをサーブレットのそのインスタンスにルーティングできなくなります。コンテナがサーブレットを再度有効にする必要がある場合は、サーブレットのクラスの新しいインスタンスを使用して有効にする必要があります。

仕様は、破棄されているサーブレットの特定のインスタンスを参照しています。

つまり、destroyが呼び出され、使用されなくなるということですか?

インスタンスが破棄されたサーブレットが使用されないという意味ではありません。ガベージコレクションされたために使用されないのは、その特定のインスタンスだけです。そのサーブレットにリクエストが届くと、コンテナはそのサーブレットの新しいインスタンスを作成し、リクエストを処理するまでのすべてのライフサイクルアクションを再度実行します。

于 2012-11-18T03:57:03.490 に答える
0

これは、それらの古典的な仕様と実装の関係の1つです。Tomcatのようなサーブレットコンテナは、仕様によりサーブレットオブジェクトのプールを維持し、負荷が増減するときにそれらを作成および破棄することが許可されています。この種のセットアップでは、特定のインスタンスが不要になったときに、destroyが呼び出されます。リクエストごとに新しいインスタンスを作成し、リクエストが処理される直前にinitを呼び出し、直後に破棄することも合法です。

ただし、実際には、事実上すべてのサーブレットコンテナが各サーブレットのインスタンスを1つだけ維持します。サーブレットはスレッドセーフである必要があるため、これも完全に問題ありません。このシナリオでは、destroyはコンテキストがシャットダウンされたときにのみ呼び出されます。

サーブレットをプールしたい場合はあまり考えられませんが、仕様では許可されています。

于 2012-11-18T03:52:36.680 に答える
0

使用しているサーブレット コンテナの実装に完全に依存します。サーブレット コンテナがリソースを節約するために非常に保守的である場合、長期間サービスされていないサーブレットが破棄される可能性があります。

サーブレット仕様 2.5 の 22 ページには、「サーブレット コンテナがサーブレットをサービスから削除する必要があると判断した場合、サーブレット インターフェースの destroy メソッドを呼び出して、サーブレットが使用しているリソースを解放して保存できるようにすることがわかります。任意の永続的な状態。たとえば、コンテナーは、メモリ リソースを節約したい場合や、シャットダウンされている場合にこれを行う場合があります。」

于 2012-11-18T04:14:24.223 に答える
0

Servlet.destroy()の javadoc は次のように述べています。どのような状況でサーブレットが「サービスを停止」するかは指定されていません。これは単に、必要に応じて対応できるイベントです。たとえば、開いているリソースを閉じたり、状態をストレージに保持したりできます。

これの最も明白な理由は、サーブレット コンテナーがシャットダウンされていることですが、サーブレットが 1 か月間使用されておらず、単にリソースを消費しているため、サーブレットをアンロードする時期であるとコンテナーが判断する可能性もあります。その動作は完全に実装次第であり、(サーブレット設計者として) 気にする必要はありません。

于 2014-05-16T15:43:16.450 に答える
0

サーブレットの destroy メソッドはコールバックです。これらは、特定のイベントが発生しようとしているときにコンテナーによって呼び出される関数です (この場合、サーブレットが破棄されようとしています)。したがって、全体の目的は、何かをしたい場合 (例: リソースのクリーンアップ)、このコールバックの下でそれらを実行できることです。

于 2017-05-31T12:41:44.323 に答える