Request-Responseループのロック
2007/03/30 (Fri) 22:07:46 JST
WebObjectsはHTTPリクエストを並列的に受け付けますが、 Request-Response ループも並列的に実行するかというと、それは別の問題です。Request-Response ループは並列的に実行することもできますが、デフォルトでは一度に一つのループしか実行しません。
Request-Response ループの並列処理の設定
WOApplication.setAllowsConcurrentRequestHandling()
でループを並列的に実行するかどうかを設定することができます。
デフォルトの挙動
デフォルトの設定では、一つのアプリケーションインスタンスにおいて、 Request-Response ループは一度に一つしか実行されません。これは異なるセッションに対しても同じです。同時にアプリケーションにアクセスすると、リクエストを受け付けることは受け付けますが、ループを実行するリクエスト以外は待ち状態になります(正確には awake()
のみ実行され、 takeValuesFromRequest()
以降は現在実行中のループが終了するまで待つ) 。例えばあるユーザがファイルのアップロードに長い時間をかければ、それだけ他のユーザもアプリケーションにアクセスできなくなります。
これだけ他の資源のロックと違って、ループを実行するスレッドが排他的になります。このため、一回のループでロックが必要な一連のデータべース操作を完結させてしまえば、EOFレベルでの同時実行制御を気にする必要はないでしょう。ただし、パフォーマンスはループを並列処理させたほうが有利です。
この仕様はObjective-Cで書かれていた4.xの名残、と考えてもいいのかもしれません。デフォルトの設定を変更して、積極的にループを並列処理させるべきかと思います。アプリケーションインスタンス間やEOF・データベース間の同時実行制御が完璧というわけではないので、ループの同時実行制御だけを気にしてもあまり意味がありません。
Inverse Pages: ロックについて