本稿では、Tomcat5でのJTAセットアップ方法(前編)と、DAOパターンによる実際のプログラムの書き方(後編)について説明します。
DAO(Data Access Object)パターンを実装するときに、トランザクションの管理方法について悩んだことはありませんか?DAOの各メソッド内部でトランザクションを管理すると、いくつかのメソッドにまたがるようなトランザクションの制御ができません。 逆に、メソッドの外部でトランザクション制御をしようとすると、JDBCをDAOの外部で使用する必要があったり、ConnectionをDAOに渡してやるような操作が必要になったりして、カプセル化がうまく図れません。 こういった問題の解決方法の一つがJTA(Java Transaction API)を使ったトランザクション管理です。JTAを用いることによって、より平易に、かつより高度にトランザクション管理を行うことができます。 前編ではJTAの概要と、Tomcat5でのJTAセットアップ方法(前編)をご紹介しましたが、後編ではDAOパターンによる実際のプログラムの書き方について説明します。
基本的な流れを押えたところで、次にDAOとしてのコーディング方法について説明します。 ポイントとしては、以下の点になります。
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: }
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: }
今回のサンプル全体で使用する例外クラスになります。本題ではないため、簡易な実装になっています。
1: package jtatest;2: 3: public class DBException extends Exception {4: public DAOException (String str) {5: super(str);6: }7: }
>>次のページへ