第8回 J2EEのトランザクション処理
J2EEのトランザクション |
ここから、いよいよJ2EEのトランザクションの解説に入ります。J2EEには、プログラマーがトランザクションを詳細まで意識しなくてもよい実装が行われています。
J2EEのトランザクション処理の特徴 |
プログラマーが「大衆化」し、その意識とスキルが変化し、同時に分散トランザクションの高度な処理が、ネットワーク・アプリケーションでも必要となるケースがあり得ることを少し詳しく見てきましたが、それには訳があります。J2EEのアプローチは、こうした問題に対する、極めて興味深い、かつ現実的な解答を提供しているからです。J2EEのトランザクション処理の最大の特徴の1つは、プログラマーが面倒なトランザクションのコードを書かなくても、コンテナが自動的にトランザクション処理をしてくれることにあります。
J2EEでは、プログラマーがトランザクション処理に精通して、正しいトランザクション処理のコードを生成することを期待するのをやめて、マシンがそれをカバーするようにしたのだと考えてもいいかもしれません。プログラマーがトランザクションを知らなくても、トランザクションはJ2EEがしっかりと面倒を見るというわけです。こうした見方は、少し意地悪に見えるかもしれませんが必ずしもそうではありません。交通量が多くて車のスピードも速い基幹道路の交差点の24時間の交通整理を、人間がやるより信号機を設置した方がよいと考えるのは、必ずしも人間不信とはいえません。まして、その交通整理をおぼつかない子どもがやっていたら、ドライバは怒りだすでしょう。
J2EEでは、エンティティ・ビーンでもセッション・ビーンでも、このContainer-Managed Transactionsの機能を使うことができます。正確にいえば、データベースとの結びつきが強いエンティティ・ビーンでは、このコンテナ管理のトランザクションしか利用することはできません。別のいい方をすれば、エンティティ・ビーンを使う限り、トランザクションは、すべてコンテナが面倒を見ることができるので、トランザクションをあえて意識する必要はありません。これは、J2EEの非常に大きな特徴です。
ここでは、エンティティ・ビーンで、データの永続性を保証するContainer-ManagedPersistent(CMP)が、EJB1.0では、オプションであったことを思い出してください。データベースとの同期を自動化しようとする、CMP2.0は、EJB2.0の中心的な目標の一つだと思いますが、ビーンとコンテナというJ2EEのアイデアの、非常に早い時期から、トランザクションへの対応が、J2EEシステムの大きな目標として意識され、早くからその実装が成功裏に行われたのは、確かだと思います。
メソッドの挟み込みとContainer-Managed Transactions |
デフォルトのContainer-Managed Transactionsでは、コンテナは、ビーンのメソッドが始まる直前にトランザクションを開始し、メソッドが終了したらトランザクションをコミットします。ここでは、これまで何度か見てきた、次のような、コンテナによるメソッドの書き換えとメソッドの挟み込みが、うまく使われています。
第6回で、次のような例を紹介しました。
public String sayHello() throws RemoteException
{ // Remoteメソッドである。 |
このように、EJBプログラマーが定義した、HelloEJBクラスのsayHelloメソッドは、コンテナの中では、上のリストのように、同名の、しかしながらRemoteのsayHelloメソッドに書き換えられ、その前後の、preInvokeメソッドとpostInvokeメソッドによって挟み込まれます。
予想がつくと思いますが、J2EEでは、このpreInvokeの中で、トランザクションの準備を行うpreInvokeTxメソッドが呼び出され、postInvokeの中で、トランザクションの後処理を行うpostInvokeTxメソッドが呼び出されます。
Deploy時に、トランザクションの属性を宣言する |
このように、Container-Managed Transactionsは、1つ1つのメソッドにトランザクション処理をするということが基本になっています。しかも、その処理の条件は、ビーンの配置時に、それぞれのメソッドについてトランザクション属性を指定することで、細かなコントロールが可能です。画面1はエンティティ・ビーンの、画面2は、セッション・ビーンのContainer-Managed
Transactionsの設定画面です。1つ1つのメソッドに対して、トランザクションの属性が設定されているのが分かると思います。デフォルトでは、“Required”という属性が選択されています。
画面1 |
画面2 |
トランザクションのscopeとトランザクション属性 |
たいていの場合には、この“Required”で十分だと思いますが、J2EEでは、トランザクションについて細かな属性が定義されています。
最初に確認したいのは、トランザクションには、スコープがあるということです。例えば、ビーンAでトランザクションが開始され、その中でメソッドAが呼び出されたとします。このとき、さらにメソッドAの中でビーンBのメソッドBが呼び出されたとしましょう。メソッドBのトランザクションは、メソッドAのトランザクションの範囲の中にあるのでしょうか? それとも、メソッドBには、新しいトランザクションが必要なのでしょうか?実は、それぞれのメソッドへのトランザクション属性の設定によって、トランザクションの範囲はコントロールすることが可能です。
J2EEのトランザクション属性には、次の6種類があります。
- Required
- RequireNew
- Mandatory
- NotSupported
- Supports
- Never
次のページから、それぞれのトランザクション属性の特徴を見ておきましょう。最初のいくつかについては、対応するコードの一部を引用しておきました。
3/5
|
J2EEの基礎(第8回) | |
コンピューティングにおけるトランザクションの必要性 | |
トランザクションの基礎を知る | |
J2EEのトランザクション | |
トランザクション属性の特長 | |
トランザクション属性 |
連載内容 | |
J2EEの基礎 | |
第1回 Java Pet Storeで、J2EEを体験する(1) | |
第2回 Java Pet Storeで、J2EEを体験する(2) | |
第4回 J2EEアプリケーションを構成するコンポーネント | |
第5回 データベースのブラウザを作る | |
第6回 EJBにおけるコンテナとコンポーネント | |
第7回 J2EEのセキュリティのキホンを知る | |
第8回 J2EEのトランザクション処理 |
連載記事一覧 |
- 実運用の障害対応時間比較に見る、ログ管理基盤の効果 (2017/5/9)
ログ基盤の構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。今回は、実案件を事例とし、ログ管理基盤の有用性を、障害対応時間比較も交えて紹介 - Chatwork、LINE、Netflixが進めるリアクティブシステムとは何か (2017/4/27)
「リアクティブ」に関連する幾つかの用語について解説し、リアクティブシステムを実現するためのライブラリを紹介します - Fluentd+Elasticsearch+Kibanaで作るログ基盤の概要と構築方法 (2017/4/6)
ログ基盤を実現するFluentd+Elasticsearch+Kibanaについて、構築方法や利用方法、実際の案件で使ったときの事例などを紹介する連載。初回は、ログ基盤の構築、利用方法について - プログラミングとビルド、Androidアプリ開発、Javaの基礎知識 (2017/4/3)
初心者が、Java言語を使ったAndroidのスマホアプリ開発を通じてプログラミングとは何かを学ぶ連載。初回は、プログラミングとビルド、Androidアプリ開発、Javaに関する基礎知識を解説する。
|
|