サーブレットの注意点

ここまでいいこと尽くめのように見えるサーブレットですが、注意すべき点もあります。

サーバのリソースを常に消費する

サーブレットはCGIと違い、リクエストに対する処理が終了した後も、プロセスを起動し続けながらリクエストを待つので、サーバのリソースを無駄に消費しているともいえます。これはサーバのリソースが限られる環境では問題になるかもしれません。

複数のスレッドが競合する可能性がある

1つのリクエストに対して1つのプロセスが起動されるCGIでは、メモリ空間やファイルといったリソースも別々に確保されます。しかしサーブレットでは1つのプロセスが持つリソースを複数のスレッドで共有しています。これはサーブレットの特徴でもありますが、同時に複数のスレッドでリソースの競合や 干渉が起きてしまう危険性をはらみます。そのためサーブレットプログラムでは、スレッドセーフなコードを書くように注意する必要があります。

サーブレットにはこのような注意点も存在しますが、それを補って余りある利点が認められ、特に大中規模Webアプリケーションの開発に広く利用されているのです。

サーブレット/JSPがどんな技術かは理解いただけたでしょうか。次にサーブレットの実行環境であるサーブレットコンテナについて見ていきたいと思います。

サーブレットコンテナの役割

サーブレットの仕組みの特徴は、Webサーバ外部のプログラムとして呼び出されるのではなく、Webサーバと連携して動作するサーブレットコンテナというモジュール上で実行される点にあります。

サーブレットの実行環境を提供

通常のWebサーバにサーブレットプログラムを配置しただけでは、動作させることはできません。サーブレットコンテナは、サーブレットを動作させる ために必要なモジュールである「Java Servlet API」を提供するとともに、サーブレットが動作するようにWebサーバを拡張します。

ライフサイクルの管理

サーブレットコンテナは、サーブレットのインスタンスを作成してコンテナ上にロードした際、init()というメソッドを呼び出し、サーブレットの初期化を行います。サーブレットがコンテナ上にロードされるタイミングは、サーブレットがはじめて呼び出された時ロードする、あらかじめロードしておくな どサーブレットコンテナの設定によって異なります。

サーブレットのロードと初期化:init()メソッド
サーブレットコンテナの主な役割に「サーブレットのライフサイクル管理」があります。サーブレットは javax.servlet.Servletインターフェースを継承したJavaクラスでなければなりません。Servletインターフェースはサーブ レットのライフサイクルを定義しています。すなわちサーブレットが呼び出されてから破棄されるまでの動作があらかじめ決められています。
 
サーブレットの実行:service()メソッド
サーブレットの初期化以降は、クライアントからリクエストがある度に「service()というメソッドを呼 び出します。service()メソッドは、HTTPリクエストのタイプ(GET、POSTなど)を判別し、doGet()、doPost()といった適 切なメソッドに渡します。これらのメソッドの実行が終了した後も、サーブレットはコンテナに常駐し、繰り返しリクエストを処理していきます。
 
サーブレットの破棄:destroy()メソッド
管理ツールから支持があった場合など「destroy()」メソッドが呼び出されてインスタンスを破棄しま す。これによってinit()メソッドで取得したリソースなども開放されます。その後、ガーベジコレクションされファイナライズされます。その Servletのインスタンスのservice()メソッドが再び実行されることはありません。destroy()メソッドが呼び出されるタイミングは サーブレットコンテナの種類によって異なる場合があります。
サーブレットのライフサイクル
図3:サーブレットのライフサイクル

このように初期化・破棄を一度しか行わないことで、複数のリクエストに対しても必要な処理だけを繰り返し実行させることができるため、パフォーマンス向上がはかられています。
表1:ライフサイクルの管理

セッション管理

コンテナはCookieを通じてクライアントの識別を管理しますが、クライアントのWebブラウザでCookieが無効なっていた場合は、URLを書き直してセッションを維持します。このCookieがONかOFFかの判別もコンテナは自動で行ってくれます。

Webアプリケーションに必要なサービスの提供

コンテナは「初期化のパラメータを用意する」「データベースへの接続を可能にする」「多言語に対応したリソースをサーブレットが見つけて参照できるようにする」といった各種のサービスも提供します。

JSPのコンパイル

コンテナはJSPが最初に呼ばれたときに、これを自動的にコンパイルしてサーブレットクラスに変換します。これはJSP APIによるものなので、厳密にはサーブレット技術とは区別されるのですが、一般にサーブレットコンテナの機能として扱われています。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30