連載
» 2002年08月06日 00時00分 公開

Webアプリケーションの高速化実験J2EEパフォーマンスチューニング(4)(4/4 ページ)

[池田俊彦,日本BEAシステムズ]
前のページへ 1|2|3|4       

チューニング例3 「EJB 2.0 Entity-Beans CMPの実装について」

 これまでに、CMPは「あまり性能が出ない」「柔軟性がなく実装しづらい」など敬遠されてきましたが、WebLogic Server バージョン6.0以降では、EJB 2.0がサポートされ、飛躍的に機能、性能が向上しました。今回のテストで、CMPと各実装方式の性能比較を行い、性能面からCMPがどこまで使えるのか実証していきたいと思います。

EJB 2.0のCMPのパフォーマンス向上について

 EJB 1.1のCMPは、ほかの実装に比べパフォーマンスを低下させる要因があります。それを防ぐには、EJB 1.1の仕様上、リスト1のように、永続化フィールドをpublic属性として実装クラスに定義し、永続化フィールドの取得、変更に関するメッソド(セッター、ゲッター・メッソド)の実装をEJBプロバイダ側(EJB開発者)で実装しなければなりません。永続化フィールドの変更を行った場合、コンテナ自身がフィールドの変更を知る手段がないため、JDBCプログラムを組んだ場合と比べると不必要と思われるSQLまで発行してしまう可能性があります。

 EJB 2.0の仕様では、リスト2のように、コンテナ側で、永続化フィールドの取得、変更に関するメッソド(セッター、ゲッター・メッソド)の実装を行うので、コンテナ側で永続化フィールドを管理でき、DBへのアクセスを適正化することができます。

Sample EJB 1.1 Implementation Class:
public class CustomerBean implements EntityBean {
    // These are persisted fields
    public int x;
    public String y;
    public SomeClass z;
   
public void setX( int input ) {  x = input;}
    public int  getX( )           {  return x; }
    …
図17 EJB 1.1のサンプル実装クラス
EJB 2.0 Fields Are Represented as Abstract Accessor Methods:
abstract public class CustomerBean implements EntityBean {
    public abstract int getX();
    public abstract void setX(int value);
    public abstract Collection getLineItems(); 
図18 EJB 1.1のサンプル実装クラス

チューニング・テストの実施

 アプリケーション・サーバの実装方式(Servlet、SLSB[Stateless Session Bean]、SFSF[State full

Session Bean]、CMP[Container-Managed Persistence]、BMP[bean-managed persistence])ごとに、負荷をかけながらパフォーマンスを測定し、CMPとほかの実装方式との性能比較を行います。負荷のかけ方としては、初期時の仮想ユーザー数は、5ユーザーとし、3分ごとに5ユーザーずつ増加させ、最大40ユーザーまで測定します。そのときの各処理の応答時間およびトランザクション数を測定します。

チューニング・テストの結果

 表9図17にパフォーマンスの測定結果を示します。テスト結果から見るとCMPはServlet、SLSB(Stateful Session Bean)に比べほぼ同等のパフォーマンスが出ています。予測していた値以上の高いパフォーマンスが得られたといえます。

実装方法
ユーザー数 CMP BMP SLSB SFSB Servlet
5 17.283 17.117 17.272 16.772 17.206
10 36.306 35.578 36.017 29.311 36.461
15 53.006 51.411 53.567 32.278 53.778
20 66.383 65.15 67.856 35.378 68.45
25 72.022 66.161 73.85 32.567 74.367
30 73.633 68.178 73.506 38.233 75.289
35 73.372 68.05 73.239 35.939 76.55
40 73.467 68.822 74.906 31.15 77.433
表9 各実装方式の秒ごとのトランザクション数(TPS)

図19 各実装方式の秒ごとのトランザクション数(TPS) 図19 各実装方式の秒ごとのトランザクション数(TPS)

Column

EJB 2.0 CMPの実装の勧め

 WebLogic Server 6.0以降で、EJB 2.0の仕様をサポートするようになってから、CMPはパフォーマンスが向上しただけでなく、実装面においても柔軟なリレーショナル設計を持たせるためのOR(Object-Relational)マッピング機能、ファインダ・メッソドのロジックに提供できるEJB-QL言語(永続ストアからデータを取り出すためのクエリ言語)の提供など、実装に柔軟性を持たせています。また、CMPの代わりに実装されてきたサーブレットもしくはセッションBeanからのJDBCプログラミングによるRDBMSアクセスの実装と比べると、下記の利点が挙げられます。

  • EJBコンテナのトランザクションやセキュリティの基本機能の恩恵がある
  • EJBであるためデータをオブジェクトととらえ、設計、実装することが可能
  • コード記述量が減るために開発生産性とテスト効率が上がり、かつバグの発生率が下がる
  • キャッシュが利用できるために実行性能が向上する
  • 基本的にJDBCプログラミングスキルは必要ない

 また、WebLogic Server 7.0Jでは、さらに、性能・実装面を向上させるために、以下の新機能も提供しています。

  • 楽観的排他のサポート……コンテナでの同時実効性向上のための排他方式を実装
  • キャッシュ性能の向上……CMP性能向上の鍵であるキャッシュのさまざまな機能向上
  • 複数テーブルマッピングのサポート……テーブルとCMP間で抽象的な表現が可能に
  • 動的クエリのサポート……クライアントからクエリを生成し発行が可能
  • WL-QL機能の向上……EJB-QLのスーパーセットであり不足機能の補完
  • バルク Insert 更新……ドライバのバッチ更新機能を利用した一括処理

 BMP、もしくはServletもしくはセッションBeanからのJDBCプログラミングの実装を採用してきた開発者からは、CMPを採用するのは、「チャレンジなこと」と思われるかもしれませんが、トライしてみる価値は十分にあると思われます。


 今回のチューニング・テストに当たり、テスト環境を小規模なPCで構成したので、WebLogic Serverの設定のほとんどが「Out Of Box」の状態でアプリケーションの性能を引き出せたと考えています。逆説的にいえば「チューニングの設定の違いが結果として著しく現れなかった」とも評価されます。大規模のテスト環境であれば、チューニングの効果がもう少し顕著に表れたのではないかと思います。

 特に、「チューニング例3 EJB 2.0 Entity-Beans CMP(Container-Managed Persistence)の実装について」では、CMPの性能を向上させるためのキャッシング機能があり、最大負荷が増えるほど、キャッシング効果が大きく表れ、場合によっては、Servlet実装の性能を超えていたかもしれません。

 しかし、本題は、「アプリケーション・サーバの性能評価でなく、チューニングの具体例である」ことから考えると、よいデータが収集できたと考えています。

前のページへ 1|2|3|4       

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。