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