ibatis DAO 사무

ibatis DAO 프레임 워 크 는 사무 관리 모듈 을 제공 합 니 다.이 사무 관 리 는 JDBC, Hibernate, JTA, SQLMAP 등 여러 장소 에 응용 할 수 있다.다음은 가장 간단 한 JDBC 로 사무 관 리 를 어떻게 실현 하 는 지 분석 해 보 자.먼저 코드 를 살 펴 보 겠 습 니 다.
public class OrderService {

  private DaoManager daoManager;

  private OrderDao orderDao;

  public OrderService() {
    daoManager = DaoConfig.getDaoManager();
    orderDao = (OrderDao) daoManager.getDao(OrderDao.class);
  }

  public void method() {
    try {
      //  a separate transaction
      orderDao.method1();   //     

      daoManager.startTransaction(); //       

      orderDao.method1();
      orderDao.method2();

      daoManager.commitTransaction();//       
    } finally {
      daoManager.endTransaction();
    }
  }
  }

method () 방법 에는 두 가지 사무 가 있 습 니 다. 방법 에서 dao Manager. startTransaction () 을 명시 적 으로 호출 하지 않 으 면 모든 DAO 의 한 번 방법 호출 은 독립 된 사무 입 니 다.  ibatis DAO 사무, 두 개의 핵심 인터페이스 Dao Transaction Manager 와 Dao Transaction 이 있 습 니 다.  서로 다른 데이터베이스 지구 층 의 실현 에 대응 하고 두 인 터 페 이 스 는 서로 다른 실현 에 대응 하고 있다.  ibatis 코드 를 보면 이 manager 들 이 사 무 를 실현 하 는 것 이 바로 트 랜 잭 션 소스 를 호출 하 는 트 랜 잭 션 방법 임 을 알 수 있 습 니 다.  JdbcDaoTransactionManager
public void commitTransaction(DaoTransaction trans) {
    ((JdbcDaoTransaction) trans).commit();
  }

 
JdbcDaoTransaction
public JdbcDaoTransaction(DataSource dataSource) {
    try {
      connection = dataSource.getConnection();
      if (connection == null) {
        throw new DaoException("Could not start transaction.  Cause: The DataSource returned a null connection.");
      }
      if (connection.getAutoCommit()) {
        connection.setAutoCommit(false);
      }
      if (connectionLog.isDebugEnabled()) {
        connection = ConnectionLogProxy.newInstance(connection);
      }
    } catch (SQLException e) {
      throw new DaoException("Error starting JDBC transaction.  Cause: " + e);
    }
  }
  
  public void commit() {
    try {
      try {
        connection.commit();
      } finally {
        connection.close();
      }
    } catch (SQLException e) {
      throw new DaoException("Error committing JDBC transaction.  Cause: " + e);
    }
  }

 
  그러면 Dao TransactionManager 는 어떤 근거 로 업 무 를 처리 합 니까?DaoTransactionState DaoTransactionState 의 코드 를 보 세 요. 아주 간단 합 니 다. 네 개의 상수 로 업무 가 서로 다른 상 태 를 표시 합 니 다.
  public static final DaoTransactionState ACTIVE = new DaoTransactionState();
  public static final DaoTransactionState INACTIVE = new DaoTransactionState();
  public static final DaoTransactionState COMMITTED = new DaoTransactionState();
  public static final DaoTransactionState ROLLEDBACK = new DaoTransactionState(); 

 
그렇다면 실제 프로그램 에 서 는 어떻게 사 무 를 통제 합 니까?  첫 번 째 코드 에서 우 리 는 이렇게 DAO 를 얻 었 다.  orderDao = (OrderDao) daoManager.getDao(OrderDao.class);  실제 daoManager 가 되 돌아 오 는 것 은 orderdao 의 구체 적 인 실현 클래스 가 아 닙 니 다. 되 돌아 오 는 DaoProxy DaoProxy 입 니 다.
public Object invoke(Object proxy, Method method, Object[] args)
      throws Throwable {
    Object result = null;
    if (PASSTHROUGH_METHODS.contains(method.getName())) {
      try {
        result = method.invoke(daoImpl.getDaoInstance(), args);
      } catch (Throwable t) {
        throw ClassInfo.unwrapThrowable(t);
      }
    } else {
      StandardDaoManager daoManager = daoImpl.getDaoManager();
      DaoContext context = daoImpl.getDaoContext();

      if (daoManager.isExplicitTransaction()) {
        // Just start the transaction (explicit)
        try {
          context.startTransaction();
          result = method.invoke(daoImpl.getDaoInstance(), args);
        } catch (Throwable t) {
          throw ClassInfo.unwrapThrowable(t);
        }
      } else {
        // Start, commit and end the transaction (autocommit)
        try {
          context.startTransaction();
          result = method.invoke(daoImpl.getDaoInstance(), args);
          context.commitTransaction();
        } catch (Throwable t) {
          throw ClassInfo.unwrapThrowable(t);
        } finally {
          context.endTransaction();
        }
      }

    }
    return result;
  }

 
  이 코드 를 보면 잘 알 수 있 습 니 다. DAO 를 호출 하 는 방법 이 있 을 때마다 dao Manager. startTransaction () 을 명시 적 으로 호출 하지 않 으 면 단독 사무 가 됩 니 다.ibatis 가 제공 하 는 터치 보드 JdbcDao Template 를 다시 보 겠 습 니 다.
protected Connection getConnection() {
    DaoTransaction trans = daoManager.getTransaction(this);
    if (!(trans instanceof ConnectionDaoTransaction)) {
      throw new DaoException("The DAO manager of type " + daoManager.getClass().getName() +
          " cannot supply a JDBC Connection for this template, and is therefore not" +
          "supported by JdbcDaoTemplate.");
    }
    return ((ConnectionDaoTransaction) trans).getConnection();
  }

 
  ibatis 가 여러 DAO 를 제어 하 는 사 무 는 실제 적 으로 이 DAO 들 이 하나의 DaoTransaction (ThreadLocal), 하나의 Connection 을 공유 하 게 하 는 것 입 니 다.    여 기 는 하나의 사무 원 의 상황 입 니 다. 만약 에 여러 사무 원 간 에 전체적인 업 무 를 완성 하려 면 분포 식 사무 관리 서 비 스 를 성실 하 게 사용 하 는 것 이 좋 습 니 다 (jta)

좋은 웹페이지 즐겨찾기