株式会社ラクス  ITエンジニア総合支援サイト スタックアスタリスク フルマネージド専用サーバー エクスユニット
ITエンジニアとして 知る 学ぶ
 
Java
.NET
PHP
プログラミング一般
DataBase
システム/サーバ構築
システム/サーバ運用
技術系一般知識
そのまま使えるシリーズ
J2EE TIPS
 
The Apache Ant Project
Sun MicroSystems
The Apache Jakarta Project
Caucho Technology
eclipse.org
>IT技術情報>Java>JTAを使ったトランザクション管理第2回:後編
【連載 】JTAを使ったトランザクション管理

第2回:後編

 
DAO(Data Access Object)パターンを実装するときに、トランザクションの管理方法について悩んだことはありませんか?
DAOの各メソッド内部でトランザクションを管理すると、いくつかのメソッドにまたがるようなトランザクションの制御ができません。
逆に、メソッドの外部でトランザクション制御をしようとすると、JDBCをDAOの外部で使用する必要があったり、ConnectionをDAOに渡してやるような操作が必要になったりして、カプセル化がうまく図れません。
こういった問題の解決方法の一つがJTA(Java Transaction API)を使ったトランザクション管理です。
JTAを用いることによって、より平易に、かつより高度にトランザクション管理を行うことができます。

本稿では、Tomcat5でのJTAセットアップ方法(前編)と、DAOパターンによる実際のプログラムの書き方(後編)について説明します。


松嶋祥文
株式会社アイティーブースト
2004/9/21
 

【 目次 】
1.はじめに
2.JTAを使った具体的なDAOコーディング
3.各種リソース管理用クラス
4.DAO クラス
5.DAOを利用するプログラムの記述方法
6.まとめ
【実行環境】
Tomcat5
JOTM-1.5.3
PostgreSQL 7.4

1.はじめに

 DAO(Data Access Object)パターンを実装するときに、トランザクション管理方法について悩んだことはありませんか?DAOの各メソッド内部でトランザクション管理すると、いくつかのメソッドにまたがるようなトランザクションの制御ができません。
 逆に、メソッドの外部でトランザクション制御をしようとすると、JDBCをDAOの外部で使用する必要があったり、ConnectionをDAOに渡してやるような操作が必要になったりして、カプセル化がうまく図れません。
 こういった問題の解決方法の一つがJTA(Java Transaction API)を使ったトランザクション管理です。JTAを用いることによって、より平易に、かつより高度にトランザクション管理を行うことができます。

 前編ではJTAの概要と、Tomcat5でのJTAセットアップ方法(前編)をご紹介しましたが、後編ではDAOパターンによる実際のプログラムの書き方について説明します。

2.JTAを使った具体的なDAOコーディング

基本的な流れを押えたところで、次にDAOとしてのコーディング方法について説明します。

ポイントとしては、以下の点になります。

  • トランザクション管理DAOの"外"から行う
  • データベースへの接続はDAOの"中"で取得する
  • データベース接続の開放はDAOの"外"から行う
これらに注意しながら、以下を読み進めてください。

3.各種リソース管理用クラス

JTAResourceUtil.Java

JTA のリソースやデータベースへの接続を管理するためのユーティリティクラスです。

1: package jtatest;
2: 
3: import java.sql.Connection;
4: import java.sql.SQLException;
5: 
6: import javax.naming.InitialContext;
7: import javax.naming.NamingException;
8: import javax.sql.DataSource;
9: import javax.Transaction.UserTransaction;
10: 
11: import jtatest.DBException;
12: 
13: public class jtaResourceUtil {
14: 
15:   private static final String DATA_SOURCE_NAME = "Java:comp/env/jdbc/myDatabase";
16: 
17:   /**
18:    * JTAを使って、トランザクション管理された接続を取得する。
19:    */
20:   public static Connection getXADBConnection() throws DBException {
21:     Connection conn = null;
22: 
23:     DataSource ds = null;
24: 
25:     try {
26:       Object obj = lookup(DATA_SOURCE_NAME);
27:       ds = (DataSource) narrow(obj, DataSource.class);
28: 
29:       conn = ds.getConnection();
30: 
31:     } catch (SQLException ex) {
32:       throw new DBException("getXADBConnection failure:" + ex.getMessage() );
33:     }
34: 
35:     return conn;
36:   }
37: 
38:   /**
39:    * トランザクション管理リソースを取り出す
40:    */
41:   public static UserTransaction getUserTransaction() throws DBException {
42: 
43:     Object obj = lookup("Java:comp/UserTransaction");
44:     UserTransaction tx = (UserTransaction) narrow(obj, UserTransaction.class);
45: 
46:     return tx;
47:   }
48: 
49: 
50: 
51:   // 以下、private メソッド
52: 
53:   private static Object lookup(final String name) throws DBException {
54:     Object result = null;
55: 
56:     try {
57:       InitialContext ctx = new InitialContext();
58:       result = ctx.lookup(name);
59: 
60:     } catch (NamingException ex) {
61:       throw new DBException("lookup failure[" + name + "]:" + ex.getMessage() );
62:     }
63: 
64:     return result;
65:   }
66: 
67:   static private Object narrow(final Object obj, final Class clazz) {
68:     return Javax.rmi.PortableRemoteObject.narrow(obj, clazz);
69:   }
70: }

MyTransaction.Java

UserTransactionによるトランザクション管理するためのオブジェクト。
begin, commit, rollback といったメソッドを持ちます。

	
1: package jtatest;
2: 
3: import Javax.Transaction.UserTransaction;
4: 
5: import jtatest.DBException;
6: import jtatest.JTAResourceUtil;
7: 
8: /**
9:  * トランザクション管理するためのオブジェクト
10:  */
11: public class MyTransaction {
12: 
13: 
14:   private UserTransaction utx = null;
15: 
16:   public MyTransaction() throws DBException {
17:     try {
18:       utx = jtaResourceUtil.getUserTransaction();
19:     } catch (Exception ex) {
20:       ex.printStackTrace();
21:       throw new DBException("begin failure:" + ex.getMessage() );
22:     }
23:   }
24: 
25:   /**
26:    * JTA を使って、トランザクションを開始する
27:    */
28:   public void begin() throws DBException {
29:     try {
30:       utx.begin();
31:     } catch (Exception ex) {
32:       ex.printStackTrace();
33:       throw new DBException("begin failure:" + ex.getMessage() );
34:     }
35:   }
36: 
37:   /**
38:    * JTA を使って、トランザクションをコミットする
39:    */
40:   public void commit()  throws DBException {
41:     try {
42:       utx.commit();
43:     } catch (Exception ex) {
44:       throw new DBException("begin failure:" + ex.getMessage() );
45:     }
46:   }
47: 
48:   /**
49:    * JTA を使って、トランザクションをロールバックする
50:    */
51:   public void rollback() throws DBException {
52:     try {
53:       utx.rollback();
54:     } catch (Exception ex) {
55:       throw new DBException("begin failure:" + ex.getMessage() );
56:     }
57:   }
58: }

DBException.Java

今回のサンプル全体で使用する例外クラスになります。本題ではないため、簡易な実装になっています。

1: package jtatest;
2:
3: public class DBException extends Exception {
4: public DAOException (String str) {
5: super(str);
6: }
7: }


>>次のページへ


【 ページ 】 | 1 | 2 |


サイト内全文検索
スタックアスタリスクのサイトを検索します。検索には、Googleを利用しています。そのため、最新の情報で検索されない可能性があります。


簡単レンタルメールフォーム
300メガ1000円〜 XBitのレンタルサーバー
500メガ1995円〜 電話サポート/PostgreSQL/専用SSLなどにも対応!お客様のニーズを網羅したレンタルサーバ
ホームページ制作のアシストウェブ
STACK* 執筆の講師陣から習得する!! ITエンジニアスクール アイティブースト
統合メールサポートシステム 〜MailDealer(メールディーラー)〜
システム開発,IT教育 〜株式会社アイティーブースト(ITBoost)〜
簡単 営業支援/顧客管理ツール Easy Sales
  利用規約 お問い合わせ・ご意見 スタックアスタリスクについて 運営会社について 
  レンタルサーバー ホスティング 専用サーバー メールフォーム ショッピングカート メール共有 ITエンジニア派遣 Linux講座 Java講座 メール配信 レンタルサーバー Webデータベース 検索サービス
CopyrightcRAKUS Co.,Ltd. All Rights Reserved.  メール管理・共有 顧客管理(CRM)もできるメール対応サポートシステム JAVA LINUX CISCO 技術者派遣 育成事業 株式会社ラクス