J2EEのベストプラクティス・トップ10(+2)(後編)

Kyle Brown, Senior Technical Staff Member, IBM Software Services for WebSphere
Keys Botzum, Senior Consulting I/T Specialist, IBM Software Services for WebSphere
Ruth Willenborg, Senior Manager, IBM WebSphere Performance
2004/8/7


8. CMT(Container Managed Transaction)を使うこと

主な内容
6.EJBコンポーネントを利用するときは、Session Facadeを常に使うこと
7.ステートフルSession BeanではなくステートレスSession Beanを使うこと
8.CMT(Container Managed Transaction)を使うこと
9.プレゼンテーション手段としてはJSPを最優先に使うこと
10.HttpSessionにはビジネス・ロジックに必要な最小限のデータだけを保管すること
11.WebSphereでは、ダイナミック・キャッシング機能をオンにし、サーブレット・キャッシング・メカニズムを利用すること
12.O/Rマッピングの手段として、まずはCMP Entity Beanを利用し、プログラマーの生産性を高めること

 トランザクション管理を自前で実装する代わりに、J2EEの2フェーズ・コミット・メカニズムを理解し利用すること。多くの場合、EJBコンテナによるトランザクションの最適化に勝るものはない。

 CMT(Container Managed Transaction)の役割は、一連の処理を組み合わせ、堅牢性を備えた1つのトランザクションを構成することである。これは、EJBコンテナのサポートがあって初めて実現可能となる、EJBの主要なアドバンテージといえる。

 アプリケーションによっては、データベース製品のトランザクション機能やjavax.jts.UserTransactionインターフェイスを使用し、トランザクションの開始と終了を明示的に制御しているものも少なくない。しかしこの方法では、将来的にいくつかのアプリケーション・モジュールを組み合わせる場合に、トランザクション制御のコードのリファクタリングが必要となることが多い。

 例えば、モジュールAとモジュールBがあり、それぞれがデータベース・トランザクションを個別に開始し、データベースの更新とトランザクションのコミットを実施しているケースを想定しよう。ここで、モジュールCからこれら2つのモジュールを呼び出すとどうなるだろうか。モジュールCでは、1つのビジネス・ロジックを実行するために、2つの独立したトランザクションを実行しなくてはならない。また、モジュールBが処理に失敗した場合には、モジュールAの処理だけがコミット済みとなってしまい、望ましい結果が得られないのである。

 一方、モジュールAとBがいずれもCMTによって実装されているとしよう。このとき、DD(Deployment Descriptor)設定に基づき、モジュールCにおいてCMTのトランザクションが自動的に開始される。また、面倒なコードの書き換えをせずとも、モジュールAとBの処理はこのトランザクションの一部として自動的に組み込まれるのである。

 また、アプリケーションの個々の処理において、複数のデータベースやリソースにアクセスしている場合は、2フェーズ・コミットによるトランザクション管理が不可欠になる。例えば、JMSのキューからメッセージを1つ取り出し、そのメッセージを基にデータベースを更新する処理を考えよう。このような処理では、「両方の処理が完了するか、もしくは両方とも実行されないかのいずれか」でなくてはならない。もし、キューからメッセージを削除した後でデータベースの更新に失敗すると、システム全体の整合性が失われてしまい、ビジネスや顧客に深刻な影響を与えかねないのだ。

 こうした問題に対し、自作の対応策で解決しようとするアプリケーションをしばしば見かける。データベースの更新処理が失敗したとき、メッセージをキューに戻すような対処である。しかし、これはお勧めできる方法ではない。この処理の途中で障害が起きたときの対応などさまざまなケースを想定しなければならず、想像するよりはるかに実現が難しいのだ。

 このような場合は、2フェーズ・コミットを使えばよい。多くのデータベースやJMSは、2フェーズ・コミットに対応している。よって、CMTのトランザクションからこれらのリソースにアクセスすれば、上述したような面倒な処理はすべてEJBコンテナが行ってくれる。具体的には、システムやデータベースなどの障害が発生したとしても、「トランザクションのすべての処理が完了するか、もしくはすべてが実行されないかのいずれか」が保証されるのである。さらに、個々のトランザクションの状態は、トランザクション・ログに記録される。このように、複数のリソースにアクセスするアプリケーションでは、CMTのトランザクション管理により数え切れないメリットが得られるのである。

9. プレゼンテーション手段としてはJSPを最優先に使うこと

 プレゼンテーションの実装手段としてJSPを最優先に使うこと。XMLやXSLTは、コントローラとバックエンドにおいて複数のプレゼンテーション形式のサポートが必要な場合にのみ用いる。

 プレゼンテーションの実装手段にはJSPではなくXMLやXSLTを使うべき、という議論をしばしば耳にすることがある。その理由として挙げられるのは、「JSPではモデルとビューが混在しやすく、XMLやXSLTならばそれを防げる」という説明である。しかし、この説明は正しいとはいい切れない。少なくとも、問題はそれほど単純ではない。

 XSLとXPathは、ほとんどプログラミング言語といってよい。XSLはルール・ベースの言語であり、プログラマーがよく使う制御構文をすべて備えているわけではないため、プログラミング言語と呼ぶには抵抗があるかもしれない。しかし実のところ、XSLはチューリング完全な言語であり、あらゆるアルゴリズムを実装する能力を備えている。

 問題は、こうしたXSLの柔軟性を開発者が乱用しかねないことだ。JSPの場合は、モデルの機能をビューで実装できることの危険性について、共通の認識が存在する。しかし、これと同じことはXSLでも起こり得る。例えば、XSLからデータベースにアクセスするような処理も、簡単ではないが実現可能である。実際に筆者らは、モデルに匹敵する高度な変換処理を実装した、極めて複雑なXSLTスタイルシートを目にしたことが何度かある。

 プレゼンテーションの実装手段としてJSPを優先すべき根本的な理由は、それが最も広く普及しているJ2EEのビュー・テクノロジーである点にある。カスタムタグの標準ライブラリJSTLやJSP 2.0の新機能などの登場により、モデルとビューがきれいに分離されJavaコードを含まないJSPページを、大変簡単に作成できるようになった。また、WebSphere Studioなどの開発環境にも、デバッグをはじめとするJSPサポート機能が豊富に搭載されている。

 多くの開発者にとっては、ルール・ベースのXSLよりも手続きベースのJSPの方がとっつきやすい。WebSphere StudioにはXSL開発のサポート機能も用意されているものの、GUIレイアウト・ツールなどのJSP機能の方が、WYSIWYGスタイルのより使いやすい開発環境を提供する。これはXSLではなかなか得られないメリットであり、特にJSFなどのフレームワークを利用した開発ではその差が顕著になる。

 JSPを選択すべきもう1つの理由は、そのパフォーマンスの良さである。IBMでは、XSLとJSPのそれぞれのパフォーマンスを比較するテストが実施された。その結果、同じ内容のHTMLページを出力する際に、大半のケースにおいてJSPの方がXSL変換よりも数倍速いことが確かめられた。これは、コンパイル済みXSLを利用した場合も同じである。すべてのケースに当てはまるわけではないが、HTML生成のパフォーマンスがネックとなる状況では、XSLの遅さが問題となり得るだろう。

 ちなみに、用途によってはXSLが適している場合もある。例えば、ある決まった形式のデータを受け取り、いくつかのスタイルシートを適用してさまざまな形式で出力するという用途である。こうした用途には、XSLの能力を活用してビューを実装するのがベストな選択だろう(Martin Fowler氏の文献を参照のこと)。とはいえ、このようなニーズはあまり多くはない。HTMLページを決まった形式で出力するだけであれば、結果的にXSLを持て余し、そこから得られるメリットよりもデメリットの方が多くなるだろう。

2/3

 INDEX

Eclipseのカスタマイズの勧め(後編)
  Page1
6.EJBコンポーネントを利用するときは、Session Facadeを常に使うこと
7.ステートフルSession BeanではなくステートレスSession Beanを使うこと
  Page2
8.CMT(Container Managed Transaction)を使うこと
9.プレゼンテーション手段としてはJSPを最優先に使うこと
  Page3
10.HttpSessionにはビジネス・ロジックに必要な最小限のデータだけを保管すること
11.WebSphereでは、ダイナミック・キャッシング機能をオンにし、サーブレット・キャッシング・メカニズムを利用すること
12.O/Rマッピングの手段として、まずはCMP Entity Beanを利用し、プログラマーの生産性を高めること

Java Solution全記事一覧





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

注目のテーマ

Java Agile 記事ランキング

本日 月間