これまでに、CMPは「あまり性能が出ない」「柔軟性がなく実装しづらい」など敬遠されてきましたが、WebLogic Server バージョン6.0以降では、EJB 2.0がサポートされ、飛躍的に機能、性能が向上しました。今回のテストで、CMPと各実装方式の性能比較を行い、性能面から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; } …
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();
アプリケーション・サーバの実装方式(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) |
WebLogic Server 6.0以降で、EJB 2.0の仕様をサポートするようになってから、CMPはパフォーマンスが向上しただけでなく、実装面においても柔軟なリレーショナル設計を持たせるためのOR(Object-Relational)マッピング機能、ファインダ・メッソドのロジックに提供できるEJB-QL言語(永続ストアからデータを取り出すためのクエリ言語)の提供など、実装に柔軟性を持たせています。また、CMPの代わりに実装されてきたサーブレットもしくはセッションBeanからのJDBCプログラミングによるRDBMSアクセスの実装と比べると、下記の利点が挙げられます。
また、WebLogic Server 7.0Jでは、さらに、性能・実装面を向上させるために、以下の新機能も提供しています。
BMP、もしくはServletもしくはセッションBeanからのJDBCプログラミングの実装を採用してきた開発者からは、CMPを採用するのは、「チャレンジなこと」と思われるかもしれませんが、トライしてみる価値は十分にあると思われます。
今回のチューニング・テストに当たり、テスト環境を小規模なPCで構成したので、WebLogic Serverの設定のほとんどが「Out Of Box」の状態でアプリケーションの性能を引き出せたと考えています。逆説的にいえば「チューニングの設定の違いが結果として著しく現れなかった」とも評価されます。大規模のテスト環境であれば、チューニングの効果がもう少し顕著に表れたのではないかと思います。
特に、「チューニング例3 EJB 2.0 Entity-Beans CMP(Container-Managed Persistence)の実装について」では、CMPの性能を向上させるためのキャッシング機能があり、最大負荷が増えるほど、キャッシング効果が大きく表れ、場合によっては、Servlet実装の性能を超えていたかもしれません。
しかし、本題は、「アプリケーション・サーバの性能評価でなく、チューニングの具体例である」ことから考えると、よいデータが収集できたと考えています。
Copyright © ITmedia, Inc. All Rights Reserved.