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

ステートフルセッションBeanは状態を保持するため、セッション情報のレプリケーションが必要になります。

デフォルトポリシーはHomeインターフェースに対しては"RoundRobin"、Remoteインターフェースに対しては"FirstAvailable"です。

レプリケーションはコストのかかる処理であるため、なるべく発生させないようにすることが望ましいのです。例えば、HTTPセッションレプリケー ションではセッションが変更されなければレプリケーションは起こりませんし、"replication-trigger"と"replication- granularity"を組み合わせれば、レプリケーションの発生を抑えられます。

ステートフルセッションBeanでは"isModified"メソッドによってレプリケーションの発生をコントロールできます。

"isModified"メソッドのシグニチャ

public boolean isModified();

EJBコンテナはレプリケーションを実行する前にこのメソッドを呼び出します。このメソッドの戻り値がtrueだった場合、EJBの状態が変更されているものとしてレプリケーションを実行します。

このロジックは自由に実装できます。例えば、EJBのフィールドとして"private boolean modified"という変数を用意し、レプリケーションして欲しいような変更が加わったときにのみ"modified"にtrueをセットします。そし て"isModified"メソッドが"modified"をreturnするように実装すれば、自分の望むタイミングでレプリケーションを発生させるこ とができます。

実装例

public class SampleSFSB implements SessionBean {

     private boolean modified = false;

     ⁄⁄ その他のフィールド

     public boolean isModified() {
          return modified;
     }

     public void setModified(boolean flag) {
          modified = flag;
     }

     ⁄⁄ その他のメソッド

}

エンティティBean

エンティティBeanではロードバランスが行われます。デフォルトポリシーはHomeインターフェースが"RoundRobin"、Remoteインターフェースは"FirstAvailable"です。

エンティティBeanはクラスタ間にまたがって整合性を維持するための分散ロックやレプリケーションの機構を持っていません。例えば、2つのクライアントがそれぞれクラスタノードAとクラスタノードBに対して同時に、同じレコードを表すエンティティBeanにアクセスした場合、クラスタノードAでの 更新がクラスタノードBでは反映されていない可能性があります。

整合性が取れない場合
図1:整合性が取れない場合

よって"read-only"以外のエンティティBeanを利用する場合には、表2のどちらかを選ぶ必要があります。

  • 「row-lock」要素をtrueに設定し、データベースレベルで行ロックをかけます
  • データベースのトランザクション独立性レベルをSERIALIZABLEにします
表2:read-only以外のエンティティBeanを利用する場合の選択肢

また、クラスタリングされるエンティティBeanのデフォルト値はコミットオプションBであり、トランザクションごとにデータベースから値を読み込んで同期を取ります。これではキャッシュによるパフォーマンス向上は期待できません。

コミットオプションAであればトランザクション間でキャッシュを共有できるのですが、上記と同様に分散ロックあるいはレプリケーションの機構がない ためクラスタ間でのキャッシュの整合性が取れません。この問題を解決するためJBossには"cache invalidation"という機能があります。

"cache invalidation"はエンティティBeanが更新された際、クラスタノード全体に「更新された」ということを伝えます。各ノードのエンティティ Beanが持つキャッシュはもはや無効であるため、次回のアクセスではエンティティBeanは最初にデータベースと同期を取ります。これによりクラスタリ ングとコミットオプションAを両立できます。

設定は"conf/standardjboss.xml"にすでに用意されているため、EJBの"jboss.xml"に、以下のように"container-name"を指定するだけです。

"container-name"の指定


     
          
               SampleEB
               SampleEBBean
               Standard CMP 2.x EntityBean with cache invalidation
          


(省略)

"cache invalidation"は更新の多いエンティティBeanでは逆にパフォーマンスが落ちる可能性があります。その場合は素直にコミットオプションBを使えばよいでしょう。

ここまではEJB 2.0の話をしてきましたが、EJB 3.0にも簡単に触れておきます。JBoss 4.0ではEJB 3.0のモジュールもデプロイ可能です(EJB 3.0仕様はまだ正式リリースされていません)。

EJB 3.0におけるエンティティBeanではリモートアクセスは提供していないので、ロードバランスという概念はありません。しかしJBossではEJB 3.0のエンティティBeanの実装にHibernateを使用しており、そのキャッシュにJBossCacheが統合されているため、EJB 2.0のエンティティBeanにはない分散キャッシュ(レプリケーション)が働き、クラスタ間で整合性の取れたキャッシュが実現されます。

人気記事トップ10

人気記事ランキングをもっと見る

企画広告も役立つ情報バッチリ! Sponsored

ClickHouse Cloudが実現した広告運用SaaS「ATOM」のデータ基盤革新、パフォーマンスを向上しながら、運用負荷とコストを削減 11月11日 6:20 AIで開発が加速する時代、品質保証はどう変わる? Tricentisが示すAIエージェント活用の実像 11月9日 6:45 悪用までの猶予が「1分」に迫るフロンティアAI時代に開発と本番を貫く脆弱性管理が必要 10月29日 8:30 欧州CRA対応とSBOM運用。AI生成コードのOSS混入問題の対策とは ――スニペット単位で検出する「FossID」「Insignary Clarity」によるSBOM運用 9月16日 6:40 PostgreSQLからTiDBへ、稼働中SaaSで進める段階的DB移行の実践と再設計への展望 9月7日 6:30 機能安全開発におけるGoogleTestの活用を支援!「Parasoft C/C++test CT」で実現する効率化&AI連携 4月14日 6:30 【CNDW2025】Grafanaが明かす「オブザーバビリティの哲学」ー最小限の労力で実用的なインサイトを得るには 1月23日 6:30 【CNDW2025】プロダクト急増に備える基盤刷新 ーウェルスナビがECSからEKSへの移行で得た知見とは 1月15日 6:30 【CNDW2025】250環境を5人で運用、構築時間は30分に ーKINTOテクノロジーズが語るインフラ基盤組織の作り方 2025年12月18日 6:30 新たな自動化で熱視線! AIエージェントの「推論能力」を支える2つのコンポーネントとは? 2025年11月28日 6:30