コネクションプーリング

コネクションプーリングは、共通 LC API の一部です。現時点では、プーリングコードへのエンドユーザーインターフェースがあるのは Lotus® Connector LotusScript® Extesnions (LSX) だけです。この機能はデフォルトでは無効化されています。これは、コネクションプーリングによって既存のコードに悪影響が及ぶのを避けるためです。

注: LSX は、標準と LEI (IBM® Lotus Enterprise Integrator®) の 2 種類のモードで稼働します。 コネクションプーリングは、LSX を標準モードで使用している場合にのみ使用できます。

コネクションプーリングの概要

LSX には、プログラムでコネクションプーリングを行うための単純なインターフェースがあります。LCSession クラスは「ConnectionPooling」というプロパティを公開します。このプロパティを TRUE に設定すると、コネクションプーリングが有効になります。

一般的なオペレーションは、大きく次の 3 つの部分に分かれています。詳しくは、サブトピック「コネクションプーリングでのイベントの順序」を参照してください。

  1. データソースに接続する
  2. 対象となる情報を特定し、情報の取得や更新を実行する
  3. データソースから切断する

2 番目のステップで、処理を実行します。大量の情報を操作する場合や、複雑なオペレーションを実行する場合は、非常に時間がかかる可能性があります。多くのアプリケーションでは、非常に短時間で処理が完了します。このようなアプリケーションでは、外部データソースへの接続と切断にかかる時間の比率が高くなります。処理要求ごとに接続と切断を行うと、さらに時間が必要となります。

LSX のコネクションプーリングプロパティを利用すると、使用しなくなったコネクションを残しておき、後で使用することができます。プーリング機能は、LCSession の ConnectionPooling プロパティで制御します。このプロパティは Boolean 型で、デフォルト値は FALSE です。このプロパティを TRUE に設定すると、それ以降の新規コネクションの要求はコネクションプール経由で処理されます。

コネクションプーリングが有効化されている場合は、新しいコネクションが要求されると、まず互換性のある既存のコネクションがプールされているかどうかがチェックされ、該当するコネクションがなければ新しいコネクションが作成されます。コネクションの互換性は、外部システムとそのシステムで必要なすべての接続プロパティによって決定します。したがって、あるユーザー用に確立されたコネクションが後で別のユーザーに使用されることはありません。例えば、最初に John のユーザー名とパスワードで作成された DB2® へのコネクションがある場合に、新しいコネクションが Jane のユーザー名とパスワードで要求されても、コネクションプールの解放は行われません。

Connect メソッドが発生すると、1 つのコネクションがプールから削除されます。Disconnect メソッドが発生すると、コネクションがプールに戻されます。明示的に切断されない場合は、オブジェクトが削除されたときに自動的に切断されます。

注: オブジェクトが明示的に削除されない場合は、関数、サブルーチン、またはスクリプトのスコープの外に出た時点で自動的に削除されます。

コネクションがプールに戻されても、外部システムからは切断されないことに注意してください。コネクションプーリングを利用するコードを作成する場合は、この動作を考慮してください。特に気をつけなければならないのは、既存システムからの通常の切断時に自動的に行われる処理です。例えば、RDBMS から切断するとき、コネクションが最初に確立された後に行われたレコードの挿入、更新または削除のコミットが起動されます。同様に、切断によってロールバックなどのデータベースオペレーションが自動的に実行されることもあります。コネクションプーリングが有効化されているときは、実際にはコネクションは除去されないため、これらのイベントは発生しません。したがって、このようなオペレーションが実行されるようにするには、スクリプトの処理部で明示的に実行する必要があります。

プールされたコネクションが存続する期間は、LSX に依存します。Notes® および Domino® の内部では、スクリプトで Uselsx ステートメントが実行された時点で LSX がロードされます。Notes または Domino の処理が終了するまでは、LSX はアンロードされません。プールされたコネクションは、関連する処理が終了するまで維持されます。

デフォルトでは、1 つの外部システムに対して最大 20 個のコネクションがプールされます。作成されたコネクションの数が最大に達し、すべて使用されている場合は、その後のコネクション要求は許可されますが、プールされません。デフォルトの設定は、notes.ini ファイルの設定を使用して変更できます。

コネクションプールを設定するには、Connector の名前、プールサイズ、およびデータソース最大数 (オプション) をカンマで区切って指定します。すべての Connector のデフォルトのプールサイズは 20 です。オプションの最大データソース値は、単一のデータベースに対して許可される接続数の制限を示します。Connector のプールサイズを超える値を指定することはできません。例えば、DB2 のプールサイズが 10 でデータソースの最大数が 5 の場合は、プールに維持される DB2 へのコネクションは 10 個までで、1 つのデータベースに対するコネクションは 5 個までです。データソース最大数を省略した場合は、プールサイズに等しくなります。

notes.ini ファイルのエントリの例を示します。

EIConnectionPool=oracle,10,db2,20,5,psoft7,4

この例では、Oracle、DB2、PeopleSoft 7.0 の 3 種類の Connector に対するプール情報が指定されています。この 3 つの Connector では、それぞれ 10 個、20 個、4 個のコネクションがプールされます。また、DB2 の場合は、1 つのデータベースへのコネクションは最高 5 個までプールできます。

注: LSX はプロセススペースによってロードおよび維持されるため、コネクションプーリングは LotusScript のエージェントに対して動作します。プロセススペースとは LSX をロードしたプロセスで、サーバー、エージェントマネージャ、HTTP、その他のプロセスなどです。また、RunOnServer メソッドを使用する 2 つのエージェントがそれぞれ別の時間に実行される場合、2 つのエージェントは同じプロセススペースで実行され、プーリングも動作します。

コネクションプーリングでのイベントの順序

LC API を使用するプログラムの処理は、一般に次の順序で実行されます。

  1. コネクションを割り当てる
  2. 接続プロパティを設定する
  3. 接続する
  4. データを選択する
  5. データを取り出す
  6. データを操作する
  7. データを保存する
  8. Disconnect
  9. コネクションを解放する

コネクションプーリングは、コネクションを確立する最初の 3 つのステップに主に影響します。各ステップに関する説明はプレゼンテーション資料に記載されています。以下の図ではコネクションプーリングの処理について説明します。

コネクションプーリングの目標の 1 つは、パフォーマンスへの悪影響を最小限にすることです。したがって、コネクションハンドルを使用するコードでは、プーリングが有効かどうか、および指定されたコネクションハンドルが通常のコネクションとプールされたコネクションのどちらを参照しているかを素早く判断する必要があります。

コネクションプールは、Connector を基準として分割されます。使用される Connector のタイプごとに、プール全体の一部分が割り当てられます。プールは、Connector ごとに設定できます。デフォルトでは、Connector 1 個につき 20 個のコネクションがプールに維持されます。ユーザープログラムから要求されるまでは、コネクションは確立されません。また、適用可能なコネクションがプールにある場合は、新しいコネクションは作成されません。プールを設定するとき、個々の Connector に対する総コネクション数の他に、同一のコネクションの数も制限できます。コネクションが同一であるかどうかは、接続パラメータまたは認証によって決まります。Connector が同じで、接続プロパティがすべて同じである場合は、コネクションは同一と見なされます。この基準は、プール内のコネクションがユーザーからのコネクション要求を満たすかどうかを判断する際にも使用されます。

Connection pooling flow diagram bmp

コネクションが最初に割り当てられるときに、プーリングが有効化されていること、および DB2、Oracle、SAP などの要求されたタイプのコネクションがプール内に 1 つ以上あることが検証されます。