トランザクション データ モジュールを使用する
多層アプリケーションの作成:インデックス への移動
COM+(Windows 2000 以降)または MTS(Windows 2000 より前)により提供される分散アプリケーション用の特別なサービスを利用するアプリケーション サーバーを作成します。これには、通常のデータ モジュールの代わりに、トランザクション データ モジュールを作成します。
トランザクション データ モジュールを使用する場合、アプリケーションは次の特殊なサービスを利用します:
- セキュリティ:
- COM+ (または MTS)は、アプリケーション サーバーに対して、ロールを使用したセキュリティを提供します。クライアントはロールが割り当てられ、これにより、クライアントがどのように MTS データ モジュールのインターフェイスにアクセスできるかを決定します。MTS データ モジュールは IsCallerInRole メソッドを実装しています。このメソッドを使用すると、現在接続しているクライアントのロールをチェックし、そのロールに応じて、特定の機能を許可することができます。。
- データベース ハンドルのプール: トランザクション データ モジュールは、ADO または dbExpress (MTS を使用しており、MTS POOLING が有効な場合)を介して確立されるデータベース接続を、自動的にプールします。あるクライアントが、あるデータベース接続を終了すると、別のクライアントがそれを再利用できます。これにより、中間層がリモート データベース サーバーからログオフし、再度ログオンし直す必要がなくなるため、ネットワーク トラフィックが削減されます。データベース ハンドルをプールする場合、データベース接続コンポーネントは、KeepConnection プロパティを False に設定して、アプリケーションが接続を最大限に共有するようにしなければなりません。。
- トランザクション: トランザクション データ モジュールを使用する際、単一のデータベース接続より強化された、トランザクション サポートを提供することができます。トランザクション データ モジュールは、複数のデータベースに渡るトランザクションに参加することも、データベースに全く関与しない関数を保有することも可能です。トランザクション データ モジュールといった、トランザクション オブジェクトによって提供されるトランザクションの詳細については、「多層アプリケーションでのトランザクション管理」を参照してください。
- Just-in-time アクティベーションと As-soon-as-possible 非アクティベーション: サーバーを記述し、リモート データ モジュール インスタンスが、必要に応じて、アクティブ化/非アクティブ化されるようにすることができます。Just-in-time アクティベーションと As-soon-as-possible 非アクティベーションを使用する際、リモート データ モジュールは、クライアント リクエストを処理する必要のあるときのみ、インスタンス化されます。これにより、データベース ハンドルなどのリソースを、非使用時には拘束しなくなります。
Just-in-time アクティベーションと As-soon-as-possible 非アクティベーションの使用は、すべてのクライアントを単一のリモート データ モジュール インスタンスを通じてルーティングする方式と、どのクライアント接続にも別個のインスタンスを作成する方式との間の手法を提供します。 リモート データ モジュールのインスタンスが単一の場合、アプリケーション サーバーが、すべてのデータベース呼び出しを、1 つのデータベース接続で処理しなければなりません。これは、ボトルネックとして動作することとなり、クライアントが多数になるとパフォーマンスに影響を及ぼす可能性があります。リモート データ モジュールのインスタンスが複数の場合、各インスタンスが別個にデータベース接続を維持しているため、データベースへのアクセスを 1 つずつ順に処理する必要がなくなります。ただし、これではデータベース接続がクライアントのリモート データ モジュールと関連付けられている間、他のクライアントはそのデータベース接続を使用することはできないため、リソースを独占してしまいます。
トランザクション、Just-in-time アクティベーション、As-soon-as-possible 非アクティベーション、リモート データ モジュール インスタンスの利点を生かすには、ステートレスでなければなりません。クライアントがステート情報に依存している場合には、さらなるサポートを提供しなければならないからです。たとえば、インクリメンタルにフェッチを行う場合、クライアントは現在のレコードに関する情報を渡さなければなりません。多層アプリケーションにおけるステート情報とリモート データ モジュールの詳細については、「リモートデータモジュールでのステート情報のサポート」を参照してください。
デフォルトでは、トランザクション データ モジュールに対して自動生成された呼び出しはすべて、トランザクショナルです(つまり、その呼び出しが終了した際、データ モジュールは非アクティブ化され、その時点でのトランザクションはコミットまたはロールバックされると想定されます)。AutoComplete プロパティを False に設定すると、永続的ステート情報に依存するトランザクション データ モジュールを記述することができますが、独自のインターフェイスを使用しない限り、それはトランザクション、Just-in-time アクティベーション、As-soon-as-possible 非アクティベーションをサポートしません。
警告: トランザクション データ モジュールを保有するアプリケーション サーバーは、データ モジュールがアクティブ化されるまで、データベース接続を開いてはいけません。アプリケーションを開発中は、そのアプリケーションが実行されるまで、すべてのデータセットがアクティブではなく、かつ、データベースは接続されていないことを確認してください。アプリケーション自体においては、データ モジュールがアクティブ化された際にデータベース接続を開き、それが非アクティブ化された際に閉じるコードを追加しkます。