第3回 EJBの正しい用い方
――JavaBeansとEJB、どちらを使えばよいのか――



EJBを流通させるという考え方

 部品を作ることが重要だと認識されてくれば、部品をたくさん作ってビジネスしようという人も出てきます。車に例えれば分かりますが、皆さんはもっと快適に車に乗りたいために、オーディオをグレードアップしたり、カーナビを付けたり、ボディに魅力あるパーツを付けたりすることも多いと思います。これらの車のパーツを求めるユーザーが多いので、パーツを専門に作る会社がたくさん生まれました。その結果、パーツの数も膨大になり大きな市場を形成しています。これと同じようにサーバサイドJavaの世界でも、自分のやりたい業務処理を行うパーツさえあれば、これを活用したいという要望が多くあります。多くのソフトウェアメーカーやベンダが、さまざまな業務処理を提供するEJBを生み出せば、これを利用して簡単にシステムが完成するはずです。このようにEJBは数多くのEJBを部品として流通させて、新しいコンピュータのビジネスを作り出す潜在的な能力も持っているといわれています。


業務処理は必ず失敗なく実行されないといけない

 第2回の講座では、業務ロジックが記述されたexecuteメソッドの説明をしました。またこのexecuteメソッドは、JavaBeansとEJBの業務ロジックとしてまったく同じものが使えることもお話ししました。しかし実はこの意味には、事前に考えておかないといけない考慮点があります。いまからこのexecuteメソッドを例に取りながら、この考慮点をお話ししてみたいと思います。以下のリスト1を見てください。

リスト1 業務ロジックの部分
1 public void execute() {
2   String DB = getDB();
3   String TABLE = getTABLE();
4   String KEY = getKEY();
5
6   try{
7     Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
8     Connection dbConn =
9     DriverManager.getConnection("jdbc:db2:"+DB,"userid","password");
10     Statement stmt = dbConn.createStatement();
11     ResultSet rs =
12     stmt.executeQuery("select * from "+TABLE+" where NO like '"+KEY+"'");
13
14     Vector hitList = new Vector();
15     while (rs.next()) {
16       String 社員番号 = rs.getString("NO");
17       String 名前 = rs.getString("NAME");
18       String 姓 = rs.getString("LAST");
19       String 名 = rs.getString("FIRST");
20       String 所属部門 = rs.getString("DEPT");
21       String 部門コード = rs.getString("CODE");
22       String 社内郵便 = rs.getString("ZIP");
23       String 内線 = rs.getString("EXT");
24       hitList.addElement
25       (社員番号+名前+姓+名+所属部門+部門コード+社内郵便+内線);
26     }
27     stmt.close();
28     dbConn.close();
29
30     int hitCnt = hitList.size();
31     RESULTS = new String[hitCnt];
32     for( int i=0; i<hitCnt; i++){
33       setRESULTS(i,(String)hitList.elementAt(i));
34     }
35   }catch ( Exception e) {
36     e.printStackTrace();
37   }
38 }

 このexecuteメソッドはJavaBeansでもEJBでもきちんと動くようにできています。しかし部品という意味を突き詰めると多少問題が出てくるメソッドでもあります。部品を活用するときに重要なのは、それを自分の持っているコンピュータに持ってきて、すぐに使えることが望ましいわけです。例えば上記のexecuteメソッドの7〜9行目には以下のような記述があります。

リスト2 業務ロジックのDBアクセス部分
Class.forName("COM.ibm.db2.jdbc.app.DB2Driver").newInstance();
Connection dbConn =
DriverManager.getConnection("jdbc:db2:"+DB,"userid","password");

 この部分はRDBに対してデータベースをアクセスするJDBCドライバを指定している個所です。ここで注意しなければいけないのは、ここにRDB固有のドライバ名(クラス名)が指定されていることです。リスト2の一番最初の記述に、COM.ibm.db2.jdbc.app.DB2DriverというJDBCドライバ名が書かれています。これはIBM社のUDBで提供されているJDBCドライバ名です。前述のとおりEJBはどのAPサーバ環境でもEJBを導入するためのインストーラが提供されており、これを使えば簡単にEJBはAPサーバに導入でき、EJBを活動状態にすることができます。

 しかしAPサーバでEJBを稼働させることができたとしても、そこに記述された業務ロジックもきちんと動くかというと必ずしもそうではありません。この業務ロジックには、特定のRDBをアクセスするドライバが記述されているため、APサーバ環境に業務ロジックが必要とするRDBも導入されていなければいけません。

図8 特定のRDBが導入されていないと動かないEJB

 こういう話は当然といえば当然のことです。しかしよく考えると、これはおかしいというユーザーもたくさんいます。例えば皆さんがWindowsでいろいろなパッケージプログラムを使っていることを思い出してください。ワープロや表計算プログラム、データベースプログラムのほとんどがWindowsで稼働するパッケージプログラムです。これをサーバサイドJavaのAPサーバ環境に置き換えてみると、Windowsに相当するのがAPサーバで、パッケージプログラムに相当するのがEJBになります。

図9 Windowsに相当するのがコンテナ。パッケージに相当するのがEJB

 Windowsパッケージは、Windowsさえあれば必ず動きます。だから私たちは安心してパッケージを購入して使うことができます。しかしEJBはAPサーバに導入して稼働させることはできますが、稼働させると問題が起こる可能性があります。これで果たしてWindowsパッケージがたくさん使われるようになったのと同じように、EJBが簡単に使える部品として世の中に流通する可能性があるのでしょうか?

 よくよく考えてみますと、WindowsパッケージはWindowsというミドルソフトで提供されたAPIや機能を使って作られています。この決まりを守って作成されているからこそWindowsが動いているどのコンピュータであっても、必ずパッケージは動くわけです。ならばこれと同じくEJBもAPサーバで提供されたAPIや機能を使うのであればどのAPサーバでも変わらず稼働するはずです。

 このようにEJBは、業務ロジックがどこでも動くがゆえ、さまざまなコンピュータ環境の違いも頭に入れて業務ロジックを作っておかなければ、思わぬ環境の違いでトラブルを引き起こし、どこでも使える業務ロジックにはならないという危険をはらみます。EJBを広く流通させるためにはWindowsパッケージと同じように、この環境の違いを乗り越えるためにどのようにEJBをデザインしておくか、この手法を頭に入れてEJBを作成しないと、真に広く流通するまでに至らないということです。しかし、ここで例に挙げたexecuteメソッドで問題のある個所は、RDBをアクセスする個所でした。

 業務ロジックでRDBをアクセスするのは当然で、もしこれを記述できなくなるとデータを読み込むことはできませんし結果を保存することもできません。これでは業務処理がまったく成り立ちません。いったい、この問題をどのように解決すればいいのでしょうか?

3/5

 INDEX

第3回 EJBの正しい用い方
  今回の内容の目的  
  JavaBeansとEJBのメリットとデメリットを知る
EJBがJavaBeansのデメリットを改善する
EJBは業務処理をサービスする窓口でもある
  EJBを流通するという考え方
業務処理は必ず失敗なく実行されないといけない
  どこでも使えるBeanにするための考慮点を知る
 

JavaBeansにするのか、EJBにするのか
では実際にどうするのか?

  

連載記事一覧




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

注目のテーマ

Java Agile 記事ランキング

本日 月間