Javaを紐解くための重点キーワード

米持幸寿
日本アイ・ビー・エム
2000/10/10
2001/7/6改訂


EJB (Enterprise JavaBeans)


EJBとは何か?

 JavaBeansはJavaクラスをコンポーネント化する技術だったが、EJB(Enterprise JavaBeans)とは何だろうか。EJB は、その名前からも分かるとおり、エンタープライズ・システム、すなわち基幹業務を意識したコンポーネント技術である。コンポーネント技術であるため“JavaBeans”という名前が付いているが、根本的にJavaBeansとは異なった技術であると認識した方がよいだろう。

 JavaBeansは、クライアント(GUIを実装した)で実行することを意識したコンポーネント技術である。ゆえに、インスタンスは基本的にローカル参照でアクセスされるし、GUIの実装に便利な機能を豊富に備えている。シリアライズ化によって、インスタンスを保管、復元することや、プロパティエディタという設定用のGUIを提供するための仕様も含んでいる。

 これに対し、EJBはサーバでの実行を前提にしている。EJBのコンポーネントは普通のクラスやJavaBeansのようにプログラム内でインスタンス化することはできない。EJBコンテナと呼ばれるサーバが必要であり、その中でインスタンス化される。

 アクセスはネーミング機構を通してリモートアクセスすることになっている。基本的には、RMI/IIOP(RMIオーバーIIOPと読む)という分散オブジェクトの技術を使ってアクセスすることになっている。EJBではシリアライズ化でディスクに保存したり、GUIを提供することは基本的に許されていない(図1)

図1 JavaBeansとEnterprise JavaBeansは根本的に異なるものである点に注意してほしい

 EJBでは、その値や状態の同期や保存をサーバに任せることができる(もちろん、アプリケーション側でも制御可能である)。どういうことかというと、処理の同期を取る機能として「トランザクション機能」、データをRDBにマッピングする機能として「パーシステンス機能」を提供するという仕様になっている。アプリケーション側で制御する場合も、このルールに従ってコーディングしなければならない。これらのEJBのトランザクション管理は、JTA(Java Transaction Architecture)によって実現される。

 EJBは、以上のような思想によって設計されており、次の内容を目標にしている。

  • パーシステンス処理実装の簡便化(特にCMPにおいて)
  • トランザクション処理実装の簡便化と確実性の追求
  • コンポーネントのポータビリティの確立
  • インターオペラビリティ(相互接続性)

 残念ながら、インターオペラビリティは、まだまだ課題が多いようであるが、パーシステンス、トランザクション、ポータビリティにおいては、かなり高いレベルで実現されており、今後の期待が膨らむ技術である。

 EJBの仕様の中で、サーバをEJBコンテナと呼ぶことは前に触れた。その中に入れるアプリケーションコードのことを「Enterprise Bean」という。Java Beansの仕様でプログラムコードのことを「Bean」と呼ぶのと同じと考えればよい。Enterprise Beanには、大きく分けて2つの種類があり、コンポーネントを開発する場合には、それぞれの部品をどの種類で作るかを決めてから作ることになる。2つの種類はさらにそれぞれ2つに分けられ、全部で4種類になる。それぞれの特徴は表3のようになる。

  SessionBean EntityBean
トランザクション処理の実装 データベースのマッピング
Stateful
SessionBean
Stateless
SessionBean
Bean
Managed
Persistence
Container
Managed
Persistence
目的 複数呼び出しにまたがるトランザクション 1回の呼び出しで終わるトランザクション 独自コードによる永続処理 コンテナにまかせた永続処理
利点 より複雑なトランザクション 軽い より細かな制御 ほとんどコーディング不要
欠点 重いリソース 複数呼び出しにまたがるトランザクションに対応できない RDB製品に依存する可能性がある RDB製品の性能が出ないことがある。コンテナごとの制約がある
 表1 EnterpriseBean の特徴

EJBはどこで使うべきか?

 EJBがはやりであるので、「とりあえず使ってみよう」というのはなかなかよい志であるが、なんでもかんでもEJBにしていこう、というのは少し考えた方がよいと思う。EJBを使うからには、EJBの利点をしっかり生かした作り方をしたい。

 EJBが目指しているのは、前にも述べたようにパーシステンス、トランザクション、ポータビリティ、インターオペラビリティなどである。これらがまったく関係ないようなシステムや、EJBを採用することによって著しく性能が落ちるような場合には、使用を控える勇気も必要である。

 例えば、名簿などの検索システムを考えてみよう。検索システムで要求される機能に「速いレスポンス」が要求されていたとする。現状では、単純なプログラムからJDBCを使ったデータベースアクセスで得られたResultSetをHTMLへ書き出すシステムの場合、Java Servlet(以下、サーブレット)を使ったシステムとEJBを使ったシステムとを比べると、明らかにサーブレットの方が速い。検索結果にヒットする件数が多くなると、さらに差が顕著になる。それでもEJBであることによるメリットが優先するなら、使う意義はあるだろう。

 これに対して、トランザクション処理を含むような場合を考えてみよう。在庫管理システムから引き当て処理を行い、決済処理をしてから出荷指示を追加するようなアプリケーションを考えてみてほしい。最低でも3つのデータベース(またはレガシーシステム)に対して更新が行われる。もし、処理途中でシステムが異常終了したり、回線エラーになったり、アプリケーションが異常終了した場合などを想定して、果たして安全なコードを記述する自信があなたにはあるだろうか。また、その記述コストを考えると、大変なことが想像できるだろう。EJBでこのような処理を記述する場合、EJBのルールに従って記述することによって、より安全に、より確実に、そして少ないコーディング量でこれらを実装することができる。これは、間違いなくEJBを使う意義のあるアプリケーションである。

 また、1つのビジネス・ロジックに対して複数の種類のクライアントからアクセスする可能性がある場合も有効である。例えば、クライアントがブラウザからHTML形式(サーブレット経由)でアクセスする、Appletからもアクセスする、クライアント・サーバ型アプリケーションからもアクセスする、サーバ側の処理からもアクセスする、などが同時に行われるような場合である。こういったビジネス・ロジックをEJBとして実装することで、外部からのアクセスをRMI/IIOP経由でのアクセスに標準化できるので、メリットがあるといえるだろう。また、ユーザーインターフェイスやプラットフォームから独立したビジネス・ロジックを実装する場面でも、将来性に期待できるであろう。このように、汎用性や将来性を見据えて、EJBをうまく活用していきたいものだ。

EJBコンポーネント・ビジネスは現実になるか?

 EJBは、コンポーネント仕様である。エンタープライズ・システムをJavaで構築するだけでなく、そこにソフトウェア部品の思想を持ち込もうというものである。コンポーネント技術の真のメリットは、単なる開発コストの削減だけでなく、大規模な再利用促進を実現することにある。一度作った部品が、ほかのシステム開発やほかのベンダでも利用できることによって、社会全体の開発効率を上げるのが目標といえるだろう。

 ソフトウェア・コンポーネント・ビジネスは、挑戦と失敗の歴史を持っている。EJBは、その歴史の中でもかなり大きく期待されている技術といわれている。それは、Javaの移植性や互換性の高さから、エンタープライズ・システムでのコンポーネント技術としての期待が高まっているといえるだろう。

 ソフトウェア・コンポーネントにより、再利用を高めるには、市場が形成されて、市販されるコンポーネントが登場することが望まれる。第三者が開発したコンポーネントを組み合わせたり、保管するコードを開発することで、新しいシステムや新しいコンポーネントを開発することができ、再利用性が高まると考えられる。

 市販コンポーネントによって市場が形成されるためには、さまざまな課題がある。それらの課題に対応するべく、昨年10月に「EJBコンポーネントに関するコンソーシアム」が設立された。同コンソーシアムでは、以下の4点に注目した部会が活動している。

  1. ポータビリティ部会
    EJBコンポーネントが、市販されて再利用されるとき、コンポーネントがさまざまなEJBコンテナで動作する必要がある。しかし、現在のEJB仕様で作られたコンポーネントは、すべてのEJBコンテナで動作させることは困難である。それは、仕様上あいまいであったり、不足している機能や規約が、コンテナの実装(製品)によって差異が生じているためである。そこで、できる限り多くのコンテナでうまく動作させられるような開発上の考慮点をまとめ、ガイドラインを策定する。

  2. コンポーネント品質/公開情報部会
    コンポーネントを市場で市販するためには、そのコンポーネントの品質や仕様などを表示する必要がある。表示されている情報をもとに、コンポーネントを検索し、必要なコンポーネントを見つけることができる。どのような項目をどういった形式で表示する必要があるかを定める。

  3. デザイン部会
    まったく見知らぬ人が作った2つのコンポーネントを組み合わせて1つのソフトウェアにする、というのが、なんとなく違和感のあることは、すぐお分かりになるだろう。これは、コーディング方法や、コンテナの問題ではなく、コンポーネントのインターフェイスなどの思想の違いによるものだ。つまり、再利用を促進するには、なんらかの「デザイン上のきまりごと」が必要なはずである。そのコンポーネント・デザイン・ガイドや組み立てガイドを策定する。

  4. 日本語用語部会
    EJBには、EJBならではの専門用語が存在する。デプロイメント記述、エンティティBeanといったものだ。これらを日本語にするとき、どのように翻訳すればよいかを対訳表として策定する。

 同コンソーシアムの詳細な情報はホームページ(http://www.ejbcons.gr.jp/)を参照していただきたい。

EJB最新仕様「EJB2.0」

 EJBは、1998年に発表され、EJB 1.1にバージョンアップされた。現存する多くのEJB対応アプリケーション・サーバ製品は、EJB 1.1対応のものが多い。現在EJBの次期バージョンであるEJB 2.0の仕様がファイナル・ドラフトで協議中である。それに含まれる主な新しい機能を簡単にご紹介しよう。

  • CMPの従属値(dependent value)と従属オブジェクト(dependent object)
    旧来のCMPでは、従属関係にある2つのオブジェクトをモデル化することができず、特殊な実装が必要だった。EJB2.0ではCMPの機能だけで、従属関係にあるデータ(例えば、部門と社員)をモデル化し、定義することができる。

  • EJBQL
    CMPの検索のセマンティクス(意味)は、旧来ではSQL文の一部を使って、コンテナごとの方式で設定できるものが多い。EJB2.0では従属値や従属オブジェクトのサポートも後押しとなって、CMPを検索するときの設定をするための仕様が盛り込まれた。SQL構文によく似ており、従属オブジェクトを検索条件として指定することもできる。

  • メッセージドリブンBean
    JMS(Java Messaging Service)により、メッセージング・システムにアクセスするアプリケーションが開発できる。メッセージング・リスナとなるようなエンタープライズBeanを開発するためのEJB仕様がメッセージドリブンBeanである。

 これらの機能は、サーバ・ベンダが独自に提供してきた機能などが、JCPへの提案によって仕様に盛り込まれたものであり、一部のサーバではすでに提供されている機能でもある。


Javaを紐解くための重点キーワード

 




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

注目のテーマ

Java Agile 記事ランキング

本日 月間