第5章 EJB サブシステムの調整


JBoss EAP は Enterprise Java Bean (EJB) をキャッシュし、初期化時間を節約できます。これは、bean プールを使用して行います。

JBoss EAP では、bean インスタンスプールbean スレッドプール の 2 種類の bean プールを調整できます。

適切な bean プールサイズは、ご使用の環境とアプリケーションによって異なります。予想される実際の条件を模倣する開発環境で、さまざまな bean プールサイズを試し、ストレステストを実行することが推奨されます。

5.1. Bean インスタンスプール

bean インスタンスプールは、ステートレスセッション bean (SLSB) およびメッセージ駆動型 bean (MDB) に使用されます。デフォルトでは、SLSB はインスタンスプールの default-slsb-instance-pool を使用し、MDB はインスタンスプールの default-mdb-instance-pool を使用します。

bean インスタンスプールのサイズによって、一度に作成可能な特定の EJB のインスタンス数が制限されます。特定の EJB の空きがない場合、クライアントはインスタンスが利用可能になるまでブロックおよび待機します。プールの timeout 属性に設定された時間内にクライアントがインスタンスを取得できないと、例外が発生します。

bean インスタンスプールのサイズは、derive-size または max-pool-size のいずれかを使用して設定されます。derive-size 属性を使用する場合、以下の値の 1 つを使用してプールサイズを設定できます。

  • from-worker-pools: 最大プールサイズはシステム上で設定されたワーカープールすべての合計スレッドのサイズから派生することを意味します。
  • from-cpu-count: 最大プールサイズはシステム上で利用可能なプロセッサーの合計数から派生することを意味します。

derive-size が未定義の場合、max-pool-size の値が bean インスタンスプールのサイズに使用されます。

注記

derive-size 属性は、max-pool-size に指定された値をすべてオーバーライドします。max-pool-size の値を反映するには、derive-size を未定義にする必要があります。

特定のインスタンスプールを使用するよう EJB を設定することができます。これにより、各 EJB タイプが使用できるインスタンスをより細かく制御できます。

5.1.1. Bean インスタンスプールの作成

ここでは、管理 CLI を使用して新たに bean インスタンスプールを作成する方法を説明します。また、管理コンソールを使用して bean インスタンスプールを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを選択し、Bean Pools タブを選択します。

新しいインスタンスプールを作成するには、以下のコマンドの 1 つを使用します。

  • 派生した最大プールサイズで bean インスタンスプールを作成する場合:

    /subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(derive-size=DERIVE_OPTION,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)

    以下の例は、CPU 数から派生した最大サイズと、2 分のタイムアウトを指定して、my_derived_pool という名前の bean インスタンスプールを作成します。

    /subsystem=ejb3/strict-max-bean-instance-pool=my_derived_pool:add(derive-size=from-cpu-count,timeout-unit=MINUTES,timeout=2)
  • 明示的な最大プールサイズで bean インスタンスプールを作成する場合:

    /subsystem=ejb3/strict-max-bean-instance-pool=POOL_NAME:add(max-pool-size=POOL_SIZE,timeout-unit=TIMEOUT_UNIT,timeout=TIMEOUT_VALUE)

    以下の例は、30 個の最大インスタンスと、30 秒のタイムアウトを指定して、my_pool という名前の bean インスタンスプールを作成します。

    /subsystem=ejb3/strict-max-bean-instance-pool=my_pool:add(max-pool-size=30,timeout-unit=SECONDS,timeout=30)

5.1.2. Bean が使用するインスタンスプールの指定

特定の bean が使用する特定のインスタンスプールを設定するには、@org.jboss.ejb3.annotation.Pool アノテーションを使用するか、bean の jboss-ejb3.xml デプロイメント記述子を編集します。詳細は、『Developing EJB Applications』の「jboss-ejb3.xml Deployment Descriptor Reference」を参照してください。

5.1.3. デフォルト Bean インスタンスプールの無効化

デフォルトの bean インスタンスプールは無効にすることができます。無効にすると、EJB はデフォルトでインスタンスプールを何も使用しません。代わりに、スレッドが EJB でメソッドを呼び出す必要があるときに新しい EJB インスタンスが作成されます。これは、作成された EJB インスタンスの数を制限したい場合に便利です。

デフォルトの beanインスタンスプールを無効にするには、以下の管理 CLI コマンドを使用します。

/subsystem=ejb3:undefine-attribute(name=default-slsb-instance-pool)
注記

bean が 特定の bean インスタンスプールを使用するよう設定されている場合、デフォルトのインスタンスプールを無効にしても、bean が使用するプールは影響を受けません。

5.2. Bean スレッドプール

デフォルトでは、default という名前の bean スレッドプールは非同期 EJB 呼び出しと EJB タイマーに使用されます。

注記

JBoss EAP 7 以降のリリースでは、リモート EJB リクエストはデフォルトで io サブシステムに定義されたワーカーで処理されます。

必要な場合は、各 EJB サービスが異なる bean スレッドプールを使用するよう設定することができます。これは、各サービスによる bean スレッドプールへのアクセスをより細かく制御する場合に便利です。

適切なスレッドプールサイズを判断するとき、想定される同時リクエストが 1 度に処理される数を考慮してください。

5.2.1. Bean スレッドプールの作成

ここでは、管理 CLI を使用して新たに bean スレッドプールを作成する方法を説明します。また、管理コンソールを使用して bean スレッドプールを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを選択し、左側のメニューにある Thread Pools を選択します。

新しいスレッドプールを作成するには、以下のコマンドを使用します。

/subsystem=ejb3/thread-pool=POOL_NAME:add(max-threads=MAX_THREADS)

以下の例は、最大 30 個のスレッドを持つ my_thread_pool という名前の bean スレッドプールを作成します。

/subsystem=ejb3/thread-pool=my_thread_pool:add(max-threads=30)

5.2.2. 特定の Bean スレッドプールを使用するよう EJB サービスを設定

特定の bean スレッドプールを使用するよう、EJB3 非同期呼び出しサービスおよびタイマーサービスをそれぞれ設定することができます。デフォルトでは、これらのサービスは default bean スレッドプールを使用します。

ここでは、管理 CLI を使用して、特定の beanスレッドプールを使用するよう上記の EJB サービスを設定する方法を説明します。また、管理コンソールを使用してこれらのサービスを設定することもできます。この場合、Configuration タブで EJB 3 サブシステムを指定し、Services タブを選択します。

特定の bean スレッドプールを使用するよう EJB サービスを設定するには、以下のコマンドを使用します。

/subsystem=ejb3/service=SERVICE_NAME:write-attribute(name=thread-pool-name,value=THREAD_POOL_NAME)

SERVICE_NAME は、以下のように設定する EJB サービスに置き換えてください。

  • EJB3 非同期呼び出しサービスの場合は async
  • EJB3 タイマーサービスの場合は timer-service

以下の例は、my_thread_pool という名前の bean スレッドプールを使用するよう EJB3 非同期サービスを設定します。

/subsystem=ejb3/service=async:write-attribute(name=thread-pool-name,value=my_thread_pool)

5.3. EJB サブシステムの調整の必要性を示す例外

  • ステートレス EJB インスタンスプールが小さすぎる、またはタイムアウトが短すぎる。

    javax.ejb.EJBException: JBAS014516: Failed to acquire a permit within 20 SECONDS
         at org.jboss.as.ejb3.pool.strictmax.StrictMaxPool.get(StrictMaxPool.java:109)

    Bean インスタンスプール を参照してください。

  • EJB スレッドプールが小さすぎる、または EJB の処理時間が呼び出しタイムアウトよりも長い。

    java.util.concurrent.TimeoutException: No invocation response received in 300000 milliseconds

    Bean スレッドプール を参照してください。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。 最新の更新を見る.

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.