CSDN博客

img flydreamgy

DAO编程学习

发表于2004/11/2 16:40:00  1189人阅读

一.DAO基本原理
 dao实现基本组件
  1.一个dao工厂类.
  2.一个dao接口.
  3.一个实现了dao接口的具体类(包含从数据源存取数据的逻辑).
  4.一个数据传送对象(值对象).

二.事务分界线(Transaction demarcation)
DAOs are transactional objects.
事务是dao模式中重要的概念,dao的所有操作,比如增,删,更新操作都是建立在事务的基础之上.因此事务分界线的是个很重要的概念.

事务分界线有两种模型:programmatic and declarative
programmatic:程序员负责编码事务的逻辑,应用程序通过API来控制事务.
declarative:程序员使用ejb的部署描述符来声明事务属性,运行环境(ejb容器)使用此属性动态的管理事务.

设计时必须考虑的问题:
  1.事务怎样开始.
  2.事务怎样结束.
  3.那个对象负责开始事务.
  4.那个对象负责结束事务.
  5.dao是否负责开始和结束事务.
  6.应用是否需要跨越多个dao访问数据.
  7.一个事务涉及到一个还是多个dao.
  8.一个dao是否要调用另一个dao的方法.

DAO中两种主要的事务分界线策略:
  1.DAO负责划分事务界限,在DAO类中嵌入事务代码.
  2.调用DAO方法的对象负责划分事务界限,事务代码在DAO之外.特别适合一个事务需要访问多个dao的情况.比如以下代码:
      tx.begin();    // start the transaction
      dao.createWarehouseProfile(profile);
      dao.updateWarehouseStatus(id1, status1);
      dao.updateWarehouseStatus(id2, status2);
      tx.commit();   // end the transaction

dao事务策略的实现主要是通过jdbc API或者是JTA ,jdbc实现比JTA实现简单,但没有JTA灵活

JDBC定界事务:
 jdbc通过connection对象来控制事务,connection对象提供了两种模式来控制:自动提交和手工提交.
 public void setAutoCommit(boolean)
  public boolean getAutoCommit()
  public void commit()
 public void rollback()
通过jdbc定界事务能在一个单独的事务中执行多条sql语句,但是不能横跨多个数据库,事务的作用范围被限制在一个数据库中.
      import java.sql.*;
      import javax.sql.*;

      // ...
      DataSource ds = obtainDataSource();
      Connection conn = ds.getConnection();
      conn.setAutoCommit(false);
      // ...
      pstmt = conn.prepareStatement("UPDATE MOVIES ...");
      pstmt.setString(1, "The Great Escape");
      pstmt.executeUpdate();
      // ...
      conn.commit();
      // ...


JTA定界事务:
 JTA和JTS为J2EE平台提供分布式事务服务,分布式事务包括一个事务管理和多个资源管理,下图展示了他们之间的关系.
JTA overview
一个JTA事务可以有多个参与者,以下的j2ee平台组件可以参与到JTA事务中出:
  JDBC connections
  JDO PersistenceManager objects
  JMS queues
  JMS topics
  Enterprise JavaBeans
  A resource adapter that complies with the J2EE Connector Architecture specification
JTA提供的方法:
 public void begin()
  public void commit()
 public void rollback()
 public int getStatus()
 public void setRollbackOnly()
 public void setTransactionTimeout(int)
Sample:
      import javax.transaction.*;
      import javax.naming.*;
      // ...LookUp JNDI
      InitialContext ctx = new InitialContext();
      Object txObj = ctx.lookup("java:comp/UserTransaction");
      UserTransaction utx = (UserTransaction) txObj;
      utx.begin();
      // ...start transaction
      DataSource ds = obtainXADataSource();
      Connection conn = ds.getConnection();
      pstmt = conn.prepareStatement("UPDATE MOVIES ...");
      pstmt.setString(1, "Spinal Tap");
      pstmt.executeUpdate();
      // ...
      utx.commit();
      // ...

 两种策略总结:
    jdbc:Transaction demarcation code is embedded inside the DAO class.
            The DAO class uses the JDBC API for transaction demarcation.
            The caller has no way to demarcate the transaction.
            Transaction scope is limited to a single JDBC Connection. 
   JTA:
            Transactions are demarcated with JTA.
            Transaction demarcation code is separated from the DAO.
            The caller is responsible for demarcating the transaction.
            The DAO participates in a global transaction

阅读全文
0 0

相关文章推荐

img
取 消
img