Webアプリケーションにおける
サーバ・サイドJavaの効果的な利用(前編)

EJBの役割とメリット

伊藤敬
日本BEAシステムズ

2000/10/10

今回のおもな内容
EJBは何のためのコンポーネントモデルか?
コンポーネントとしての特徴
実際にはどのように利用されているのか?
セッションBeanとエンティティBean
EJBは高い生産性を提供するコンポーネントモデル

EJB(Enterprise JavaBeans)はもはやアプリケーション・サーバ上でシステム構築する際に必要不可欠な存在になりつつある。なぜ、JavaServletとJSPだけでは不十分なのか? EJBはサーバ・サイドにおけるJavaアプリケーションでどのような効果的な役割を果たすのか? といった疑問に答える。


   EJBは何のためのコンポーネントモデルか?

 EJB(Enterprise JavaBeans)については、さまざまなメディアを通じていろんな解説や最新情報が提供されています。しかし、一般的には日本語で書かれた書籍がほとんどない状態が続いていますし、EJBの仕様がまとめられた、米JavaSoftが提供するEJB仕様書も日本語訳が提供されていません。こうした事情もあって、現場でシステム開発に従事している方々にとってEJBはそれほど身近なものではないのと同時に、なかなかとっかかりをつかみにくい状態なのではないかと思われます。そこで、従来のシステムをEJBベースのシステムに再構築した事例を基に、EJBはシステムの中でどんな役割を担い、その活用によってどのようなメリットを享受できるのかについて説明したいと思います。

 まず、EJBをモデルとしてとらえてみましょう。そうするとEJBもクライアント・サーバモデルの一種であると言えます。また同時に、EJBはソフトウェア・コンポーネントの一種です。その最も大まかな定義は米JavaSoftが提供する「Enterprise JavaBeans Specification v1.1 (release 12/17/99)」に以下のように簡潔に述べられています。

「The Enterprise JavaBeans architecture is an architecture for component-based distributed computing.Enterprise beans are components of distributed transaction-oriented enterprise applications.」

 「EJBとは、分散トランザクションを実行する分散型エンタープライズ・アプリケーションを構築するためのコンポーネント・モデルである」ということです。


 ではどういう点が従来のクライアント・サーバモデルと違うかというと、EJBが想定するシステムの形態の基本形として、Webサービスとそれを拡張した分散型eコマースアプリケーションの提供、既存システムが持つデータベースへのアクセスと連携、既存システム自身との連携などがあります。かつ、そうしたサービスに対し、クライアントがインターネットを経由してWebブラウザや携帯端末などでアクセスする、ざっとこんな感じのシステム構成が想定されています。今まさに注目されるシステム形態であるわけです。そんなシステム構成の中で、EJBの役割とメリットは何でしょうか。以下に少し挙げてみましょう。

(役割)

  • 上に示したような形態の分散システム上でアプリケーションロジックを集約する
  • ビジネスロジックをコンポーネント化、システムに組み込む
  • リレーショナル・データベースをオブジェクト・リレーショナル・マッピングによってオブジェクト化し、システム内で利用しやすくする

(メリット)

  • 高い生産性
  • システム拡張のしやすさ、メンテナンス性の向上
  • 分散システムの中での階層の明確化(プレゼンテーション層、アプリケーション層、オブジェクトデータ層など)
  • 共通のエンタープライズJava技術として相互利用性が拡大
  • コンポーネントとしてのポータビリティが保証される

   コンポーネントとしての特徴

 もう1つの側面である、コンポーネントとしての特徴を少しまとめてみましょう。既存のコンポーネントといえば、ActiveXやJavaBeansなどが思い浮かぶと思いますが、それらとはどのような違いがあるのでしょうか。

(特徴)

  • コンポーネント・アーキテクチャは基本的にJavaBeansと同じ
  • サーバ・サイドのコンポーネントであるため、GUIは持たない。また、クライアントとの相互通信だけでなく、サーバ上のEJB同士での通信も可能
  • 主にWebアプリケーション・サーバが提供している、EJBコンテナの中で動作する。このEJBコンテナがエンタープライズ・アプリケーションのローレベルのサービス(トランザクション制御、EJB自身のライフサイクル管理、マルチスレッド制御、各種オブジェクトのプーリングやキャッシングなど)を提供するので(図1)、EJBのプログラミングとしては基本的にこれらのサービス部分は記述しなくてもよい

図1 EJBコンテナの役割

 これまでにも、CORBAをはじめ、標準的な分散型エンタープライズ・アプリケーションのアーキテクチャはいくつか提案、製品化されてきました。しかし、このEJBほど、明確にエンタープライズ・アプリケーションとそこで利用できるコンポーネントの定義を明確に示した仕様はないと思います。そういった意味において、EJBは非常に画期的であり、かつ実用的なアーキテクチャであると言えます。

   実際にはどのように利用されているのか?

 では、現在日本のシステム構築の現場の中で、EJBはどのように利用されているでしょうか。そうした活用事例の中から、もう少しEJBの役割とメリットを具体化してみましょう。
 日本BEAシステムズが提供する「BEA WebLogic Server」は、世界で最も進んだEJBテクノロジーを搭載した製品として、既に約2年のEJBをベースとするシステム開発における多くの実績を持っています。日本においても、多くのEJBベースの活用事例があります。今回はそうしたいくつかの事例を基に、典型的なEJB活用事例を取り上げてみたいと思います(今回ご紹介する事例は、いくつかの実在する事例をミックスしたものです。その1つ1つのシステム構築は、それぞれの目的を持っており、必ずしも利用できる技術をすべて利用しているとは限らないからです)。

 あるオンライントレーディング会社がWebで提供する個人向け証券取引システムを例に取ります。この会社ではWebサーバ上でCGIを使って構築していたシステム(図2)を、Webアプリケーション・サーバを導入しServletやEJBを使ったシステムに再構築しました。

図2 あるオンライントレーディング会社の個人向け証券取引システムのシステム構成。以前はこのようにCGIで構築されたていたが、すぐにシステム再構築の必要に迫られた。

 まず、なぜシステムを再構築する必要があったか、ですが、

  • ユーザー数が短期間に急激に増加し、想定していたシステム許容量を超えてしまった
  • ユーザーアクセスの増加でデータベースへの負荷が大きくなりすぎ、システムのパフォーマンスが著しく低下すると同時にシステムとしてのバランスが悪くなった
  • 以上2つの問題点を克服すると同時に、今後のビジネス拡大のためには、さらに多くのユーザーアクセスにも耐えられるよう、システムの許容量を大きくすることを検討する必要が生じた
  • システム構成を多層化することによって、負荷が過大になった場合などに、ボトルネックになっている層へすぐにハードウェアの増強などを行えるようにしたい

 これらの問題点の解決とニーズを満足させるためのソリューションとして、Webアプリケーション・サーバの導入とServlet/JSPによる動的なコンテンツ生成、そしてEJBによるビジネスロジックの集約化とオブジェクトデータの活用を決断したのです。

 図2に示すように、以前のシステムでは、Webサーバ上のCGIアプリケーションから直接データベースへ接続しており、すべてのシステム処理をCGIモジュールとRDBMSのストアドプロシージャによって開発、運用していました。しかし、オンライントレーディングというビジネスの性格上、個人ユーザーが1回株式を購入するという処理を行っただけでも、数回の計算処理がストアドプロシージャで発生します。この処理が予想以上にシステムへの負荷を与えることになりました。大量のユーザーからの処理要求が発生した際、システムはバランスを崩し、Webサーバ側は処理に余裕があるのに、DBサーバ側の負荷が極大になってしまうという状況が生まれました。

 そこでまず、Webアプリケーション・サーバの導入によって、システム全体の開発言語をJavaに移行しました。さらに、Servlet/JSPによって動的なコンテンツの生成にかかる負荷を下げました。そして、EJBの採用によってそれまでストアドプロシージャに頼っていた計算処理をコンポーネント化し、Webアプリケーション・サーバに移行することができました。また、計算処理にセッションBeanを採用することで、オブジェクトプーリングによる処理を高速に行うことが可能になりました。さらに、エンティティBeanを採用することで、販売商品の内部的なデータ変更や計算式の変更などに迅速に対応できるようになりました(図3)

図3 Webアプリケーション・サーバを導入し、CGIベースのシステムをJava(Java ServletとJSP、EJB)で再構築した。

 また、Webアプリケーション・サーバの導入によってDBコネクションプールを使用することでDBコネクションにかかっていた負荷が著しく減ったということも大きな要因となっています。

   セッションBeanとエンティティBean

 システムのEJB化の中で、「セッションBean」と「エンティティBean」という2種類のEJBが出てきました。これらはEJBの基本を構成するBeanコンポーネントの仕様です。このアーキテクチャの説明は次回行う予定ですが、ここではそのメリットを述べておきます。

 セッションBeanの主な役割は、Webアプリケーション・サーバ上でコンポーネント化された形でビジネスロジックの処理を提供することにあります。その提供のしかたとして、セッションBeanにはさらに2つのBeanコンポーネント仕様があります。

 コンポーネントへの1回のアクセスで処理を完結して結果をクライアントに戻す「ステートレスセッションBean」と、処理の完結まで複数回のアクセスが可能であり、かつアクセス時の状態変更がBean内に保存され、セッションステート情報として維持する「ステートフル・セッションBean」とがあります。

 今回の新システムでは、計算処理のほとんどをRDBMSのストアドプロシージャからステートレスセッションBeanに移行しています。さらに、ユーザーのWebページ上での操作情報をステートフルセッションBeanが管理しています。これによって複数のリクエストによる状態の遷移や、リクエストごとの情報を内部的に保っています。

 これら2つのセッションBeanで実現された機能は、当然Servlet/JSPでも実現できます。しかし、セッションBeanの方がServlet/JSPよりビジネスロジックのコンポーネント化(独立化)がしやすく、拡張性とメンテナンス性に優れています。

 また、新システムで取り扱う商品(例えば独自開発の投資信託など)をエンティティBean化しています。エンティティBeanは簡単に言えばOODB(オブジェクト指向データベース)と基本的に同等の機能を持つコンポーネントモデルです。つまり、ある実在物をオブジェクトと表現してプログラミングでき、RDBMSが扱う2次元的なテーブルへデータの入出力を行うのではなく、そのプログラム上のオブジェクト内部に属性と処理を持たせて永続化されたオブジェクトとすることができます。そのメリットは設計とプログラミングのしやすさと既存のデータベースとの連携を非常に簡単にしてくれ、かつそれぞれの層の独立性を保つことができるという点です。

 エンティティBeanも2つのコンポーネントモデルを持っています。それはCMP(コンテナマネージドエンティティBean)とBMP(ビーンマネージドエンティティBean)です。これらは基本的にWebアプリケーション・サーバ側の機能に依存する部分があるので次回に紹介したいと思います。

   EJBは高い生産性を提供するコンポーネントモデル

 ご紹介したシステムの再構築によって、以下のようなEJBのメリットがご理解いただけたと思います。

  • 分散エンタープライズシステムの分散化されたそれぞれの層の独立性を高める
  • 拡張性とメンテナンス性
  • システム構築の高い生産性
  • 標準的な技術の採用による相互運用性の提供

 こうしたシステムの構築期間は約3カ月とされることが多く、長くても6カ月以上かけることはほぼないといってよいでしょう。そうした短期開発でも十分な機能の開発ができなければいけない、EJBベースのシステム開発には高い生産性と機能性が求められているのです。また、システムの拡張性とメンテナンス性も非常に重要な要素です。

 eコマースアプリケーションに求められる「敏速なサービス内容の拡張と変更」を可能にするには、EJBとServlet/JSPの組み合わせのような独立性と機能性の高いアーキテクチャが非常に有効なのです。これからもこうしたシステム構築へのニーズはどんどん膨らんでいくでしょう。そうした状況に対応していくためには、まず基本的なEJBアーキテクチャの理解が重要になります。後編ではそのアーキテクチャにスポットを当てたいと思います。

 

Webアプリケーションにおけるサーバ・サイドJavaの
効果的な利用
前編 EJBの役割とメリット
 EJBは何のためのコンポーネントモデルか?
 コンポーネントとしての特徴
 実際はどのように利用されているのか?
 セッションBeanとエンティティBean
 EJBは高い生産性を提供するコンポーネントモデル
  後編 EJBのアーキテクチャ
 EJBの基本的なアーキテクチャ
 EJBコンテナはシステムの中核

 EJBコンテナが提供する機能

 セッションBeanとエンティティBeanの役割


Java Agile フォーラム 新着記事
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Java Agile 記事ランキング

本日 月間