サーブレット・プーリングを使用不可にする: ベスト・プラクティスおよび考慮事項
アプリケーションがそのアプリケーション内部でスレッドを作成する場合、 あるいはリクエスト・オブジェクトおよびレスポンス・オブジェクトを再利用する Web コンテナーに懸念がある場合には、 要求および応答プーリングを使用不可にすることができます。
要求および応答プーリングを使用不可にする
- アプリケーションがそのアプリケーション内部でスレッドを作成する場合。
サーブレット 2.4 仕様には、以下の規定があります。
SRV.4.10 要求オブジェクトの 存続時間 各要求オブジェクトは、サーブレットのサービス・メソッドの範囲内、 またはフィルターの doFilter メソッドの範囲内でのみ有効です。 コンテナーは通常、 要求オブジェクトをリサイクルすることにより、要求オブジェクト作成のパフォーマンス・オーバーヘッドを回避します。 開発者は、上記の範囲外の要求オブジェクトへの参照を維持することは、予期しない結果を招くことがあるため推奨されないことに注意する必要があります。
SRV.5.6 応答オブジェクトの 存続時間 各応答オブジェクトは、サーブレットのサービス・メソッドの範囲内、 またはフィルターの doFilter メソッドの範囲内でのみ有効です。 コンテナーは通常、 応答オブジェクトをリサイクルすることにより、応答オブジェクト作成のパフォーマンス・オーバーヘッドを回避します。 開発者は、上記の範囲外の応答オブジェクトへの参照を続けると、 予期しない動作を招く可能性があるので注意してください。
- 要求および応答オブジェクトを再利用する Web コンテナーの再利用に懸念がある場合。
これらのオブジェクトが再利用される場合、
2 つの個別のアプリケーション内の 2 つの要求が、同じ要求または応答オブジェクトにアクセスする
可能性があります (サーブレット 2.4 の『スレッド・セーフティー』セクションを参照)。
SRV.2.3.3.3 スレッド・セーフティー要求および応答オブジェクトの実装では、 スレッド・セーフが保証されていません。 つまり、これらのオブジェクトは、要求処理スレッドの有効範囲内でのみ使用できます。
要求および応答オブジェクトへの参照を、 別のスレッドで実行されるオブジェクトに与えないでください。その結果の動作が予想できないためです。 アプリケーションが作成する スレッドがコンテナー管理オブジェクト (要求オブジェクト、応答オブジェクトなど) を使用する場合、 それらのオブジェクトにはサーブレットのサービス・ライフサイクル内でのみアクセスする 必要があります。また、このようなスレッド自体がサーブレットのサービス・メソッドの ライフサイクル内にライフサイクルを持っている必要があります。サービス・メソッドの終了後に これらのオブジェクトにアクセスすると、予期しない問題が発生することがあるためです。 要求および応答オブジェクトはスレッド・セーフではないことに注意してください。 複数のスレッドでこれらのオブジェクトにアクセスした場合は、アクセスを同期するか、ラッパー経由で アクセスすることで、スレッド・セーフティー (例えば、要求属性にアクセスするメソッドの 呼び出しの同期化や、スレッド内での応答オブジェクト用出力ストリームの使用) を追加する必要があります。