Java EE 環境でのオブジェクト・プーリング

Java EE アプリケーション・サーバーは、メッセージ駆動型 Bean アプリケーション、Enterprise Java Beans およびサーブレットで使用できる接続プーリング機能を提供します。

WebSphere® Application Server は、パフォーマンスを向上させるために、 JMS プロバイダーへの接続のプールを維持します。 アプリケーションが JMS 接続を作成すると、アプリケーション・サーバーは、空き接続プールに接続が既に存在するかどうかを判別します。 既存の接続があれば、その接続がアプリケーションに戻されます。それ以外の場合は、新規接続が作成されます。

図 1 は、アクティベーション・スペックとリスナー・ポートの両方が JMS 接続を確立し、その接続を使用して通常モードでメッセージの宛先をモニターする方法を示しています。
図1: 通常モード
アクティベーション・スペックとリスナー・ポートがどのように JMS 接続を確立し、その接続を使用してメッセージの宛先をモニターするかを示すフローチャート。

IBM® MQ メッセージング・プロバイダーを使用する場合、アウトバウンド・メッセージングを実行するアプリケーション (Enterprise Java Beans およびサーブレットなど)、およびメッセージ駆動型 Bean リスナー・ポート・コンポーネントは、これらの接続プールを使用できます。

IBM MQ メッセージング・プロバイダー・アクティベーション・スペックは、 IBM MQ リソース・アダプターによって提供される接続プール機能を使用します。 詳しくは、 WebSphere MQ リソース・アダプターのプロパティーの構成 を参照してください。

コネクション・プールの使用例では、アウトバウンド・メッセージングを実行するアプリケーションやリスナー・ポートがJMSコネクションを作成する際にどのようにフリー・プールを使用するかを説明します。

フリー・コネクション・プールのメンテナンス・スレッドでは、アプリケーションまたはリスナー・ポートがコネクションの処理を終了したときに、これらのコネクションがどうなるかを説明する。

プール・メンテナンスのスレッド例では、JMS接続が古くなるのを防ぐために、どのようにフリー接続プールがクリーニングされるかを説明しています。

WebSphere Application Server では、ファクトリーから作成できる接続の数に制限があります。これは、接続ファクトリーの 「最大接続数」 プロパティーで指定します。 このプロパティーのデフォルト値は 10 であり、これは、ファクトリーから一度に作成できる接続の数が最大 10 個であることを意味します。

各ファクトリーには、1 つの空き接続プールが関連付けられています。 アプリケーション・サーバーの始動時に、空き接続プールは空になっています。 ファクトリーの空きプールに存在可能な接続の最大数も、maximum connections プロパティーで指定されます。

ヒント: JMS 2.0では、接続ファクトリーを使用して、接続とコンテキストの両方を作成できます。 そのため、接続とコンテキストの両方が混在する接続ファクトリーを接続プールに関連付けることが可能です。 1 つの接続ファクトリーでは、接続だけを作成するか、あるいはコンテキストだけを作成することをお勧めします。 このようにすると、その接続ファクトリーの接続プールには 1 種類のオブジェクトのみが含まれるようになるので、プールの効率が向上します。

WebSphere Application Serverでの接続プールの動作については、 JMS 接続の接続プールの構成を参照してください。 その他のアプリケーション・サーバーについては、該当するアプリケーション・サーバーの資料を参照してください。

接続プールの使用方法

すべての JMS 接続ファクトリーには接続プールが関連付けられており、接続プールには 0 個以上の JMS 接続が含まれています。 すべての JMS 接続には関連付けられた JMS セッション・プールがあり、すべての JMS セッション・プールには 0 個以上の JMS セッションが含まれます。

図 2 は、これらのオブジェクト間の関係を示しています。
図2: 接続プールとセッション・プール
JMS 接続とセッションの間の関係を示すフローチャート
リスナー・ポートが始動する、またはアウトバウンド・メッセージを実行するアプリケーションがファクトリーを使用して接続を作成する場合、ポートまたはアプリケーションは以下のメソッドのいずれか 1 つを呼び出します。
  • connectionFactory.createConnection()
  • ConnectionFactory.createConnection(String, String)
  • QueueConnectionFactory.createQueueConnection()
  • QueueConnectionFactory.createQueueConnection(String, String)
  • TopicConnectionFactory.createTopicConnection()
  • TopicConnectionFactory.createTopicConnection(String, String)
WebSphere Application Server 接続マネージャーは、このファクトリーの空きプールから接続を取得し、それをアプリケーションに戻そうとします。

プール内に空き接続がなく、このファクトリーから作成される接続の数がファクトリーの maximum connections プロパティーに指定された制限にまだ達していない場合、接続マネージャーはアプリケーションが使用する新規接続を作成します。

ただし、アプリケーションが接続の作成を試み、このファクトリーから作成される接続の数がファクトリーの maximum connections プロパティーと既に等しくなっている場合、アプリケーションは接続が使用可能になる (空きプールに戻される) まで待機します。

アプリケーションが待機する時間は、接続プールの connection timeout プロパティーで指定され、デフォルト値は 180 秒になります。 180 秒の間に接続が空きプールに戻されると、接続マネージャーはそれをすぐに再度プールから取り出してアプリケーションに渡します。 ただし、タイムアウト期間を超過すると、ConnectionWaitTimeoutException がスローされます。

アプリケーションが接続を終了し、以下を呼び出してその接続を閉じた場合:
  • Connection.close()
  • QueueConnection.close()
  • TopicConnection.close()
接続は実際に開いたままになり、空きプールに戻されて、別のアプリケーションが再使用できるようになります。 したがって、アプリケーション・サーバー上で JMS アプリケーションが実行されていない場合でも、 WebSphere Application ServerJMS プロバイダーの間の接続を開くことができます。