データ モジュールの存続期間管理
アプリケーション サーバーの構造 への移動
オブジェクト プーリングを利用することで、クライアントで共有されるデータ モジュールのキャッシュを作成し、それによってリソースを節約することができます。 これがどのように動作するかは、公開されるデータ モジュールのタイプと接続プロトコルによって決まります。
サーバー モジュールの存続期間
DataSnap 技術を使って作成されるサーバー アプリケーションには、TDSServerClass のインスタンスが含まれています。 このインスタンスの LifeCycle プロパティはサーバー モジュールの存続期間を指定します。 取り得る値は以下のとおりです。
- Invocation
- Server
- Session(デフォルト値)
Invocation 存続期間の設定が Invocation の場合は、どのクライアント要求にも、指定されたデータ モジュールのインスタンスを新規作成するように、DataSnap サーバーに指示します。 そのデータ モジュールがサーバー メソッドを公開している場合は、メソッド呼び出しごとに新しいインスタンスが作成されます。 その呼び出しの後、データ モジュールは自動的に破棄されます。
Server 存続期間の設定として Server を選択した場合、DataSnap サーバーは、接続したクライアントごとにデータ モジュールのインスタンスを作成した後、再利用します。 Server が役に立つのは、データ モジュールがクライアントに関する情報をまったく持たない設計になっており、どのクライアントから使用されようと、それに対してサービスを提供できる場合です。 この設定を用いて作成されたデータ モジュールはすべて、DataSnap サーバーの停止時に解放されます。
Session Session オプションはデフォルトで設定されており、ほとんどの状況で最も良い選択肢となるように設計されています。 Session モードの場合、DataSnap サーバーはクライアントごとにデータ モジュール インスタンスを 1 つ作成します。 そのデータ モジュールは、クライアントが接続している限り存続します。 クライアントが接続を解除すると、このインスタンスは解放されます。 これにより、セッション中にいつでも利用できる明確な情報を維持管理することができます。
データ モジュール(COM)のプーリング
COM+ にインストールされるトランザクション データ モジュールを作成する場合は、COM+ コンポーネント マネージャを使用して、アプリケーション サーバーをプールされるオブジェクトとしてインストールすることができます。
たとえトランザクション データ モジュールをしなくても、TWebConnection を使って接続を確立する場合は、オブジェクト プーリングをうまく利用することができます。 このような第 2 のタイプのオブジェクト プーリングでは、作成されるデータ モジュールのインスタンス数を制限します。 この場合、保持しなければならないデータベース接続だけでなく、データ モジュールで使用される他のあらゆるリソースの数も制限されます。
(呼び出しをリモート データ モジュールに渡す)Web サーバー アプリケーションは、クライアント要求を受け取ると、プール内の使用可能な最初のリモート データ モジュールにそれらを渡します。 使用可能なリモート データ モジュールがない場合は、(指定の最大数に達するまで)新規に作成します。 これは、すべてのクライアントを単一のリモート データ モジュール インスタンスを通じてルーティングする方式(このインスタンスがボトルネックになるおそれがある)と、どのクライアント接続にも別個のインスタンスを作成する方式(多くのリソースを消費するおそれがある)の妥協案となります。
プール内のリモート データ モジュール インスタンスは、しばらくクライアント要求を受け取らない場合、自動的に解放されます。 これにより、使用されていないにもかかわらずリソースがプールに独占されるということはなくなります。
Web 接続(HTTP)を使用する際にオブジェクト プーリングをセットアップするには、リモート データ モジュールで UpdateRegistry メソッドをオーバーライドする必要があります。 オーバーライドされたメソッドでは、リモート データ モジュールの登録時に RegisterPooled を、リモート データ モジュールの登録解除時に UnregisterPooled を、それぞれ呼び出します。
どちらのオブジェクト プーリング メソッドを使用する場合も、リモート データ モジュールはステートレスでなければなりません。 単一のインスタンスで複数のクライアントからの要求を処理する可能性があるからです。 このインスタンスが永続的な状態情報に基づいて動作したら、クライアントは互いに干渉し合うおそれがあります。 リモート データ モジュールのステートレス性を確保する方法の詳細は、「公開データ モジュールでの状態情報のサポート」を参照してください。