2011-01-13 12 views
3

フィルタを使用するコストにハードデータが存在するかどうかを知りたいですか? たとえば、動作を共有するためにサーブレット上の遺産を使用するか、フィルタを使用するかのどちらかですか?誰かがハードデータを投稿することができた場合パフォーマンスに対するjavax.servlet.Filterの影響?

おかげで、

アントワーヌ

答えて

13

は、私は驚かれることでしょう。そして、たとえそうであっても、数字はフィルタで何が行われているかによって決まるため、あなたには関係しません。それは早すぎる最適化カテゴリにも入る可能性があります。あなたが本当に何かを悪くしない限り、それは問題にはならないでしょう。

「遺産」は「継承」を意味し、フィルタははるかに優れた解決策であると言います。あなたは設定でそれらをオフとオンにするオプションがあります。

フィルタは、HTTPリクエストのデコレータまたはアスペクトです。それらはよく尊重され、実証済みのパターンなので、なぜサーブレットでの使用には有用で安全ではありませんか?

私はあなたの懸念が大声で言いたいと思います。

これまで述べてきたように、パフォーマンスが問題になるような複雑で複雑なフィルタチェーンを構築することはお勧めしません。圧縮、ロギング、パフォーマンスメトリックなどを行い、12のフィルタを連鎖させると、問題が発生する可能性があります。

+3

しかし、圧縮、ロギング、パフォーマンスメトリックなどを行う必要がある場合は、フィルタに実装されているかどうかに関係なく、同じ時間がかかります。私がフィルタに関して気に入らない部分は、深いスタックトレースですが、それは美容的であり、許容されるスタックコール深度よりも下です。そして、「あまりにも多くの可動部品」という問題(すなわち構成オーバーヘッド)があります。 – Thilo

+0

@Thilo:Java EE 6では設定を行わずに済むので、これも解決されます。 –

+0

EE6は、XMLがなくなるという点で大きく改善されましたが、あなたはまだどこかで設定する必要があります(注釈はもちろんIDEやプログラマーに面白い)。 – Thilo

3

フィルタで実際に行った作業で測定できないものはありません。サーブレットと同じように、毎回作成されるフィルタの新しいインスタンスさえありません。

継承よりも大きな利点は、実行時に構成および作成できることです(親クラスがコンパイルされ、1つしか存在しない可能性があります)。

考慮すべき点の1つは、フィルタはリクエストをラップするだけで、前後に(またはその代わりに)コードを追加できます。サーブレットが実行された後、応答はすでにコミットされている可能性があります。リクエスト処理の途中にコードを挿入することはできません。親クラス(またはサーブレットの終わりにある他の技術)で正しく定義されたコールバックが可能です。これは、フィルターが特定のタスクに適切でない可能性があることを意味します。

関連する問題