1.2.2.3 ステートフル・オブジェクトを使用すべき場合
ステートフル・オブジェクトは、一度アクティブ化されると、オブジェクトが存在しているプロセスが停止されたり、オブジェクトがアクティブ化されているトランザクションが完了したりといった、特定のイベントが発生するまで、メモリー内にとどまります。
次のような場合には、ステートフル・オブジェクトの使用をお薦めします:
- 1つのオブジェクトが、存続期間の長い既知のオブジェクトなど、多数のクライアント・アプリケーションによって頻繁に利用される場合。サーバー・アプリケーションによりこれらのオブジェクトがアクティブな状態に維持されていると、通常、クライアント・アプリケーションがそれらにアクセスする際のレスポンス時間が最短化されます。アクティブなオブジェクトは多くのクライアント・アプリケーションに共有されるので、このタイプのオブジェクトでメモリーにあるものは比較的少数です。
ノート:
オブジェクトをトランザクションにどのように関係させるかについては、注意深く検討してください。オブジェクトは、一時的(トランザクション・バウンド)または永続的(プロセス・バウンド)に特定のプロセスにバインドできます。トランザクションに関係するオブジェクトは、他のクライアント・アプリケーションまたはオブジェクトからは呼び出せません(Oracle Tuxedoでは、オブジェクトがビジー状態であるというエラーが戻される可能性があります)。ステートフル・オブジェクトは多数のクライアント・アプリケーションによって使用されるため、頻繁にまたは長期間トランザクションに関係すると、ボトルネックの原因になる可能性があります。 - トランザクションを完了するために1つのオブジェクト上でクライアント・アプリケーションが操作を連続して呼び出す必要がある場合や、こうした呼出しの間にユーザーからの入力を待機する際にクライアント・アプリケーションがアイドル状態でない場合。この場合、呼出しの間にオブジェクトが非アクティブ化されると、各呼出しの間に状態の書込みおよび読取りが行われるため、レスポンス時間が遅くなります。
ステートフル・オブジェクトは次のように動作します:
- 状態情報はサーバーの呼出しの間維持され、オブジェクトは通常、指定された期間、特定のクライアント・アプリケーション専用になります。クライアントとサーバー・アプリケーション間でデータの送受信が行われても、追加のコンテキスト情報またはアプリケーションの状態情報が、サーバー・プロセスによりメモリーに保持されます。
- 1つ以上のステートフル・オブジェクトが大量のマシン・リソースを使用している場合、ステートフル・オブジェクトと関連付けられていないタスクおよびプロセスに対するサーバー・パフォーマンスは、ステートレス・サーバー・モデルより劣ります。
たとえば、1つのオブジェクトがデータベースにロックを保持し、大量のデータをメモリーにキャッシュしている場合、そのステートフル・オブジェクトによって使用されているデータベースおよびメモリーは、トランザクションが完了するまで他のオブジェクトで使用できません。