DAO編程學習

一.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事務可以有多個參與者,以下的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

發佈了25 篇原創文章 · 獲贊 1 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章