Servlet基本_サーブレットのライフサイクル、スレッドセーフ

1、サーブレットのライフサイクル
初期化時         ⇒  init()                  【初回リクエスト時】
  ↓
リクエスト時       ⇒service() ⇒doGet()         【Httpリクエストメソッドにより振り分け】
                        或は⇒doPost()
                        或は⇒・・・
  ↓
サーバ停止時      ⇒destroy()

init()について、
初回リクエスト時に呼ばれる。初期化を遅らせる処理は、遅延初期化(Lazy Loading)と呼ばれる。
遅延初期化を行わず、最初にinit()を呼び出したいときは、<load-on-startup>要素を設定する。
これで、指定されたサーブレットがwebアプリケーション起動時にロードされる。

2、アプリケーションスコープ
頻繁に更新されるようなデータをアプリスコープに保存してしまうと、同期制御の影響が大きくなる。
よって、共通に利用する読み取り専用のデータを格納するケースが多い。
アプリケーションスコープは、javax.servlet.ServletContextインタフェースを通して操作する。
ServletContextオブジェクトの取得はHttpServlet.getServletContextで。

3、シングルインスタンス・マルチスレッド
サーブレットは同時に複数のクライアントからアクセスされる可能性がありますので、マルチスレッドで動作する。
即ち、同じサーブレットへのリクエストに対しては同じインスタンスが利用される。
このため、サーブレットのフィールドは、private宣言しても、複数のリクエスト間で共有されるということになる。
読み取り専用のデータや定数以外はサーブレットのフィールドに定義すべきではない。

4、同時アクセス
同じセッションのFirefoxの場合、同じURLへのアクセスはレスポンスが戻ってくるまで待機するようなので、サーブレット同時アクセスの確認はIEなどでください。
⇒ Firefox Ver.22.0 で試したけど、大丈夫だった。

5、スレッドセーフ
データ          スレッドセーフか
---------------------------------------------
ローカル変数         ○
インスタンス変数       ×
static変数          ×
リクエスト属性        ○
セッション属性        ×
アプリケーション属性    ×
ページ属性          ○

また、SingleThreadModelインタフェースを実装することでサーブレットの実行が同期化されるが、パフォーマンスが悪い。
例: public class MyServlet extends HttpServlet implements SingleThreadModel {
(同期は必要なコードのみ最小限行うべき)


转载于:https://www.cnblogs.com/nliao/p/3183517.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值