空き接続プール保守スレッド

各空き接続プールには、空きプールをモニターし、その中の接続が有効な状態を保っていることを確認するプール保守スレッドが関連付けられています。

プール保守スレッドが、空きプール内の接続を破棄する必要があると決定した場合、スレッドは IBM® MQへの JMS 接続を物理的に閉じます。

プール保守スレッドの動作方法

プール保守スレッドの動作は、接続プールの以下の 4 つのプロパティーの値によって決まります。
Aged timeout
開いたままの状態の接続時間。
Minimum connections
接続マネージャーが接続ファクトリーの空きプール内に保持する接続の最小数。
Reap time
プール保守スレッドの実行頻度。
Unused timeout
接続が閉じられるまでに空きプール内に留まる時間。

デフォルトでは、プール保守スレッドは 180 秒間隔で実行されますが、この値は、接続プールの Reap time プロパティーを設定することで変更できます。

保守スレッドは、プール内の各接続について、その接続がどのくらいの時間プール内に留まっているか、およびその接続が作成され、最後に使用されてからどのくらいの時間が経過したかを検査します。

接続が接続プールの Unused timeout プロパティーの値より長い期間使用されていない場合、保守スレッドは、現在フリー・プールにある接続の数を検査します。 この数に応じて、以下のようになります。
  • 接続数が Minimum connections の値よりも多い場合、接続マネージャーは接続を閉じます。
  • 接続数が Minimum connections の値と等しい場合、接続は閉じられず、空きプール内に残されます。

Minimum connections プロパティーのデフォルト値は 1 であり、これはつまり、パフォーマンス上の理由から、接続マネージャーが空きプール内に少なくとも 1 つの接続を常に保持しようと試みることを意味しています。

Unused timeout プロパティーのデフォルト値は 1800 秒です。 デフォルトでは、接続が空きプールに戻され 1800 秒以上使用されない状態が続くと、その接続は閉じられます。その接続を閉じたとしても、空きプール内には少なくとも 1 つの接続が残されます。

この手順により、未使用の接続が不整合になることを防ぎます。 この機能をオフにするには、Unused timeout プロパティーを 0 に設定します。

接続が空きプール内にあり、作成されてから経過した時間が接続プールの Aged timeout プロパティーの値よりも長い場合、その接続は最後に使用してからの経過時間に関係なく閉じられます。

デフォルトでは、Aged timeout プロパティーは 0 に設定されます。これは、保守スレッドがこの検査を実行しないことを意味します。 Aged timeout プロパティーよりも長い時間存続している接続は、空きプール内に残される接続の数に関係なく廃棄されます。 この状況に、Minimum connections プロパティーが影響を与えることはない点に注意してください。

プール保守スレッドの無効化

上記の説明から、プール保守スレッドがアクティブになるとかなりの量の作業を行うことがわかります。これは特に、接続ファクトリーの空きプール内に多数の接続がある場合に顕著です。

例えば、3 つの JMS 接続ファクトリーがあり、各ファクトリーの Maximum connections プロパティーが 10 に設定されているとします。 180 秒おきに、3 つのプール保守スレッドがアクティブになり、各接続ファクトリーの空きプールを個別にスキャンします。 空きプールに多数の接続がある場合、保守スレッドは多くの作業を行うことになり、そのことがパフォーマンスに重大な影響を与えます。

個々の空き接続プールの Reap time プロパティーを 0 に設定することで、それらのプール保守スレッドを無効にすることができます。

保守スレッドを無効にするということは、接続が Unused timeout を超過しても閉じられないことを意味します。 ただし、Aged timeout を超えた場合には、接続が閉じられます。

アプリケーションが接続を終了すると、接続マネージャーは接続の存続期間を確認します。その期間が Aged timeout プロパティーの値よりも長い場合、接続マネージャーは接続を空きプールに戻すのではなく、接続を閉じます。

Aged timeout のトランザクションへの影響

前のセクションで説明したように、 Aged timeout プロパティーは、接続マネージャーが接続を閉じる前に JMS プロバイダーへの接続を開いたままにする期間を指定します。

Aged timeout プロパティーのデフォルト値は 0 であり、これは、接続が古くなりすぎても閉じられることがないことを意味します。 Aged timeout を使用可能にすると、EJB 内で JMS を使用する際にトランザクションに影響を与える可能性があるため、 Aged timeout プロパティーはこの値のままにしておく必要があります。

JMSでは、トランザクションの単位は JMS セッションであり、 JMS 接続から作成されます。 トランザクションに登録されるのは JMS セッション であり、 JMS 接続ではありません。

アプリケーション・サーバーの設計により、 Aged timeout が経過したために、その接続から作成された JMS セッションがトランザクションに関与している場合でも、 JMS 接続を閉じることができます。

JMS 接続を閉じると、 JMS 仕様で説明されているように、JMS セッションで未処理のトランザクション作業がロールバックされます。 ただし、アプリケーション・サーバーは、接続から作成された JMS セッションが無効になったことを認識しません。 サーバーがそのセッションを使用してトランザクションのコミットまたはロールバックを試みると、IllegalStateException が発生します。
重要: EJB 内からの JMS 接続で Aged timeout を使用する場合は、 JMS 操作を実行する EJB メソッドが終了する前に、 JMS セッションですべての JMS 作業が明示的にコミットされていることを確認してください。