ナビゲーションをスキップ

WebLogic エンタープライズ JavaBeans (EJB) プログラマーズ ガイド

  前 次 前/次ボタンと目次ボタンとの区切り線 目次  

セッション EJB

この節では、セッション Bean が EJB コンテナの中でどのように機能するのかを説明し、セッション Bean に固有の設計および開発ガイドラインも提供します。Bean 開発の全体的なプロセスについては、「エンタープライズ JavaBean の実装」を参照してください。

この章は、Java のプログラミングおよびセッション Bean の機能に精通している読者を対象としています。セッション Bean の機能の概要およびセッション Bean のアプリケーションでの典型的な使用方法については、「セッション EJB によるビジネス ロジックの実装」および「セッション Bean の機能」を参照してください。

以下の節では、セッション Bean のライフサイクル、設計上の考慮事項、および主要な実装タスクの手順について説明します。

 


ステートレス セッション Bean とステートフル セッション Bean の比較

この節では、ステートレス セッション Bean とステートフル セッション Bean の主な違いについて説明します。

表 5-1 ステートレス セッション Bean とステートフル セッション Bean の比較

ステートレス セッション Bean

ステートフル セッション Bean

必要になるたびに Bean を作成するオーバーヘッドを削減するためにメモリにプールされる。WebLogic Server は必要なときに Bean のインスタンスを使用し、処理が完了したらそれをプールに戻す。

ステートレス セッション Bean は、ステートフル Bean よりも処理速度が速い。

各クライアントは Bean の新しいインスタンスを作成し、最終的にそれを削除する。インスタンスは、キャッシュがいっぱいの場合はディスクにパッシベーションできる。

アプリケーションは ejbRemove() を発行して Bean をキャッシュから削除する。

ステートフル セッション Bean は、ステートレス セッション Bean ほどのパフォーマンスは発揮しない。

ID がなく、クライアントとの関連もない。匿名である。

特定のクライアント インスタンスにバインドされる。各 Bean には暗黙の ID がある。クライアントがセッション中にステートフル セッション Bean と対話する場合、それは毎回同じオブジェクトに対して行われる。

持続しない。Bean に呼び出し間の状態はない。

持続する。ステートフル セッション Bean の状態は、セッションが終わるまで保持される。

どのタイプのセッション Bean をいつ使用するのかについては、「ステートレス Bean とステートフル Bean の選択」を参照してください。

 


ステートレス セッション EJB のプール

デフォルトでは、WebLogic Server には起動時にステートレス セッション EJB インスタンスは存在しません。個々の Bean が呼び出されると、WebLogic Server は EJB の新しいインスタンスを初期化します。

ただし、プロダクション環境では、WebLogic Server は非バインド ステートレス セッション EJB (現在メソッド呼び出しを処理していないインスタンス) のフリー プールを使用することでステートレス セッション EJB のパフォーマンスとスループットを向上させることができます。リクエストの処理に利用できる非バインド インスタンスがある場合は、リクエストがインスタンスの作成を待つ必要がないので応答時間が向上します。フリー プールは、できる限りオブジェクトの再利用やコンテナ コールバックのスキップをすることでパフォーマンスを改善しています。

WebLogic Server は起動時に、自動的にフリー プールを作成し、weblogic-ejb-jar.xml ファイルの Bean のデプロイメント要素 initial-beans-in-free-pool で指定された量のインスタンスをそのプールに配置します。デフォルトでは、initial-beans-in-free-pool は 0 に設定されています。

次の図に、WebLogic Server のフリー プールと、ステートレス EJB がフリー プールに出入りするプロセスを示します。点線は、WebLogic Server 側から見た EJB の「状態」を表しています。

図 5-1 ステートレス セッション EJB のライフサイクルを示す WebLogic Server フリー プール
ステートレス セッション EJB のライフサイクル

プールをコンフィグレーションした場合、WebLogic Server はフリー プールの EJB インスタンス (利用可能な場合) を利用してメソッド呼び出しに対応します。EJB は、クライアントのメソッド呼び出しの間アクティブ状態になります。メソッドが完了すると、EJB のインスタンスはフリー プールに戻されます。WebLogic Server は各メソッドの呼び出し後にクライアントからステートレス セッション Bean を非バインドするので、クライアントが使用する実際の Bean クラスは呼び出しごとに異なります。

EJB クラスのすべてのインスタンスがアクティブで、max-beans-in-free-pool に達した場合、EJB クラスを要求する新しいクライアントは、アクティブ EJB がメソッド呼び出しを完了するまでブロックされます。トランザクションがタイムアウトになった場合 (トランザクション非対応の呼び出しでは、5 分経過した場合)、WebLogic Server は、リモート クライアントに対しては RemoteException を、ローカル クライアントに対しては EJBException を送出します。

注意 : フリー プールの最大サイズは、max-beans-in-free-pool 要素の値、使用可能メモリ、または実行スレッドの数によって制限されます。

アプリケーションがフリー プールの Bean インスタンスを要求した場合には、以下の 3 通りの結果が考えられます。

 


ステートフル セッション EJB のキャッシュとパッシベーション

WebLogic Server は、Bean インスタンスのキャッシュを使用してステートフル セッション EJB のパフォーマンスを高めます。キャッシュはメモリ内にアクティブな EJB インスタンスを格納することで、それらをクライアント リクエストに即座に使用できるようにしています。キャッシュには、クライアントによって現在使用されている EJB と最近使われていたインスタンスが格納されます。キャッシュ内のステートフル セッション Bean は、特定のクライアントと結び付いています。

次の図に、WebLogic Server のキャッシュと、ステートフル EJB がキャッシュに出入りするプロセスを示します。

図 5-2 ステートフル セッション EJB のライフサイクル

ステートレス セッション EJB のライフサイクル


 


 

ステートフル セッション EJB の作成

WebLogic Server には起動時にステートフル セッション EJB インスタンスは存在しません。クライアントがステートフル セッション Bean へのアクセスを開始する前に、Bean とのセッションで使用する新しい Bean インスタンスが作成されます。セッションが終了すると、インスタンスは破棄されます。セッションが進行中の間は、インスタンスはメモリにキャッシュされます。

ステートフル セッション EJB のパッシベーション

パッシベーションは、EJB の状態をディスク上で保持しつつキャッシュからその EJB インスタンスを削除するために WebLogic Server が使用するプロセスです。パッシブ化されている EJB はメモリには存在せず、キャッシュに格納されているときのようにクライアント リクエストに応じて即座に使用することはできません。

EJB 開発者は、ejbPassivate() メソッドが呼び出されたときに、ステートフル セッション Bean が、WebLogic Server によってそのデータがシリアライズされてそのインスタンスのパッシベーションが行われるような状態に置かれるようにしなければなりません。パッシベーションの間、WebLogic Server は transient であると宣言されていないフィールドをシリアライズしようとします。つまり、すべての非 transient フィールドがシリアライズ可能なオブジェクト (Bean のリモートまたはホーム インタフェースなど) を表すようにしなければなりません。EJB 2.1 では、許可されるフィールド タイプが指定されています。

パッシベーションの制御

ステートフル セッション Bean のパッシベーションを制御するルールは、Bean の cache-type 要素の値によって決まります。この要素の値は以下のいずれかです。

idle-timeout-seconds 要素と max-beans-in-cache 要素も、cache-type の値に基づいてパッシベーションと削除の動作に影響を与えます。

積極的なパッシベーション (LRU)

cache-typeLRU に設定してステートフル セッション Bean の積極的なパッシベーションをコンフィグレーションすると、コンテナは以下のようにしてインスタンスをディスクにパッシベーションします。

コンテナは、パッシベーションされたインスタンスを、そのパッシベーション後、idle-timeout-seconds の期間非アクティブな状態が続いた後にディスクから削除します。この動作は、怠惰な削除と呼ばれます。

怠惰なパッシベーション (NRU)

cache-typeNRU に設定して怠惰なパッシベーションをコンフィグレーションすると、関連するシステムのオーバーヘッドが原因でコンテナは Bean のパッシベーションを回避します (キャッシュに影響を与えるのは、Bean のパッシベーションまたは積極的な削除を引き起こすイベントのみとなります)。

コンテナは以下のように動作します。

EJB のキャッシュ サイズの管理

プロダクション環境でパフォーマンスを最適化するキャッシュ サイズの管理については、『WebLogic Server パフォーマンス チューニング ガイド』の「ステートフル セッション Bean とエンティティ Bean のキャッシュ サイズの設定」を参照してください。

パッシベーションされた Bean の永続ストア ディレクトリの指定

ステートフル セッション Bean がパッシベーションされると、その状態がファイル システムのディレクトリに格納されます。各サーバ インスタンスには、パッシベーションされたステートフル セッション Bean の状態を格納する専用のディレクトリ (永続ストア ディレクトリ) があります。永続ストア ディレクトリは、パッシベーションされた Bean ごとに 1 つのサブディレクトリを格納します。

永続ストア ディレクトリは、たとえば次のようにサーバ インスタンスのディレクトリにデフォルトで作成されます。

D:\releases\610\bea\user_domains\mydomain\myserver\pstore\

永続ストアのパスは次のとおりです。

RootDirectory\ServerName\persistent-store-dir

各要素の説明は次のとおりです。

永続ストア ディレクトリには、パッシベーションされた各 Bean 用のサブディレクトリ (ハッシュ コードで命名される) が格納されます。たとえば、上の例のパッシベーションされた Bean のサブディレクトリは次のようになります。

D:\releases\810\bea\user_domains\mydomain\myserver\pstore\14t89gex0m2fr

ステートフル セッション Bean への同時アクセスのコンフィグレーション

EJB 2.0 仕様によると、ステートフル セッション EJB に同時アクセスすると RemoteException が送出されます。ステートフル セッション EJB に関するこのアクセス制限は、EJB クライアントが WebLogic Server の内部にあるのかそれともリモートにあるのかに関係なく適用されます。この制限を無効にして、同時呼び出しが可能なようにステートフル セッション Bean をコンフィグレーションするには、allow-concurrent-calls デプロイメント要素を設定します。

複数のサーブレット クラスがステートフル セッション EJB にアクセスする場合は、サーブレット クラスのインスタンスごとではなくサーブレット スレッドごとに独自のセッション EJB インスタンスを使用する必要があります。同時アクセスを避けるために、JSP またはサーブレットはリクエスト スコープでステートフル セッションを使用できます。

 


セッション Bean の設計上の決定

この節では、セッション Bean に関連するいくつかの設計上の決定について説明します。

ステートレス Bean とステートフル Bean の選択

ステートレス セッション Bean は、アプリケーションでビジネス メソッドの呼び出しの間に特定クライアントの状態を保持する必要がない場合は適切な選択肢です。WebLogic Server はマルチスレッドで、複数のクライアントに同時にサービスを提供します。ステートレス セッション Bean を使用した場合、EJB コンテナはセッションの間各クライアントのインスタンスを確保するのではなく、プールにある利用可能な Bean インスタンスを自由に利用してクライアント リクエストに応えることができます。その結果、リソースの使用率、スケーラビリティ、およびスループットが向上します。

ステートレス セッション Bean のメリットは、その実装が軽量であることです。ステートレス セッション Bean は、アプリケーションの Bean が Bean 同士の対話なく独立した別個のタスクを実行する場合に優れた選択肢となります。

ステートフル セッション Bean は、セッションが終わるまで Bean の状態を保持する必要がある場合に良い選択肢です。

ステートレス セッション Bean とステートフル セッション Bean のアプリケーションの例については、「ステートレス セッション Bean」および「ステートフル セッション Bean」を参照してください。

ステートレス セッション Bean の最適なフリー プール設定の選択

initial-beans-in-free-pool および max-beans-in-free-pool の値を選択するときには、メモリ消費とアプリケーションの速度低下を天秤にかけて検討する必要があります。ステートレス セッション Bean インスタンスの数が多すぎると、フリー プールにメモリを消費する非アクティブなインスタンスが格納されます。数が少なすぎると、クライアントは必要なときにインスタンスを取得できない場合があります。その場合は、インスタンスが解放されるまでクライアント スレッドがブロックされて、アプリケーションの速度が低下します。

通常、max-beans-in-free-pool はサーバ インスタンスのワーカ スレッドと同数にします。そうすれば、スレッドが処理を試みるときに、インスタンスが利用可能な状態にあります。

 


セッション Bean の実装

エンタープライズ JavaBean の実装」では、セッション Bean 実装の手順が説明されています。この節では、Bean 固有のデプロイメント記述子要素を設定して WebLogic Server 固有のセッション Bean の動作をコンフィグレーションする詳細について説明します。

WebLogic に固有のセッション Bean のコンフィグレーション可能な動作

表  5-2 では、ステートレス セッション Bean の動作をコンフィグレーションするために設定するデプロイメント記述子要素について、および要素をコンフィグレーションしない場合の Bean の動作についてまとめられています。リストされている要素はすべて、weblogic-ejb-jar.xmlstateless-session-descriptor 要素のサブ要素です。

表  5-3 では、ステートレス セッション Bean の動作をコンフィグレーションするために設定するデプロイメント記述子要素について、および要素をコンフィグレーションしない場合の Bean の動作についてまとめられています。リストされている要素はすべて、weblogic-ejb-jar.xmlstateful-session-descriptor 要素のサブ要素です。

表 5-2 ステートレス セッション EJB の WebLogic 固有の機能

制御の対象

設定する weblogic-ejb-jar.xml の要素

デフォルト動作

起動時の WebLogic Server に存在するステートレス セッション Bean の非アクティブなインスタンスの数。

ステートレス セッション EJB のプール」を参照。

initial-beans-in-free-pool

フリー プールで Bean は作成されない。

非アクティブなステートレス セッション Bean のフリー プールの最大サイズ。

max-beans-in-free-pool

フリー プールの Bean の最大数は 1000 に制限される。

クラスタでステートレス セッション EJB のインスタンスがどのようにレプリケートされるのか。

信頼性と可用性の機能」を参照。

stateless-clustering

home-is-clusterable

home-load-algorithm

home-call-router-class-name

stateless-bean-is-clusterable

stateless-bean-load-algorithm

stateless-bean-call-router-class-name

stateless-bean-methods-are-idempotent

EJB はクラスタ内の複数のサーバにデプロイできる。


表 5-3 ステートフル セッション EJB の WebLogic 固有の機能

動作

weblogic-ejb-jar.xml の要素

デフォルト

Remote Exception が送出されることなく、複数のクライアントが Bean に同時にアクセスできるかどうか。

ステートフル セッション Bean への同時アクセスのコンフィグレーション」を参照。

allow-concurrent-calls

False - ステートフル セッション Bean インスタンスによるメソッド呼び出しの処理中に、同時に他のメソッド呼び出しがサーバに送信されたときに、サーバは RemoteException を送出する。

EJB コンテナがエラーを起こすことなくトランザクション コンテキスト内でステートフル セッション Bean を削除できるかどうか。

allow-remove-during-transaction

False - ステートフル セッション Bean がトランザクション コンテキスト内で削除されるとサーバは例外を送出する。

キャッシュに存在できるステートフル Bean のインスタンスの数。

max-beans-in-cache

1000

ステートフル セッション Bean のインスタンスがキャッシュに留まり (max-beans-in-cache に達していないものと仮定)、パッシベーションの後、ディスクに留まるようになるまでの活動のない状態の期間。

idle-timeout-seconds

600 秒

キャッシュからステートフル セッション Bean のインスタンスを削除するルール。

cache-type

NRU (最近未使用) - この動作の説明については、「怠惰なパッシベーション (NRU)」を参照。

パッシベーションされたステートフル セッション Bean のインスタンスの状態を WebLogic Server が格納する場所。

persistent-store-dir


メソッドのフェイルオーバをサポートするには、クラスタ化された EJB の多重呼び出し不変メソッドを指定する。多重呼び出し不変のメソッドは、ネガティブな副作用なしに繰り返すことができる。

idempotent-methods

なし

ホーム メソッド呼び出しのルーティングに使用するカスタム クラス。

home-call-router-class-name

なし

Bean のホームがクラスタ化できるかどうかを示す。

home-is-clusterable

True

Bean ホームのレプリカ間でロード バランシングを行うためのアルゴリズム。

home-load-algorithm

プロパティ weblogic.cluster.
defaultLoadAlgorithm
で指定されたアルゴリズム。

クラスタのステートフル セッション Bean に使用するレプリケーションを示す (in-memory または none)。

replication-type

なし

 

フッタのナビゲーションのスキップ  ページの先頭 前 次