成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

探索的ibatis DAO事務管理模塊

開發 后端
ibatis DAO框架提供了事務管理模塊。而這個事務管理可以應用到很多場合,包括JDBC、Hibernate、JTA、SQLMAP等。但是,很多朋友對于ibatis DAO的事務管理模塊還不是很了解。咱們這就來了解一下ibatis DAO的事務管理。

ibatis DAO 框架提供了事務管理模塊。而這個事務管理可以應用到很多場合,包括JDBC、Hibernate、JTA、SQLMAP等。

下面以最簡單的JDBC來分析一下ibatis DAO如何實現事務管理。

首先來看一段代碼:

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()方法里有著兩個事務,如果在方法里不顯式的調用daoManager.startTransaction(),則每個ibatis DAO的一次方法調用就是一個獨立的事務。

 ibatis DAO事務,有兩個核心接口DaoTransactionManager和DaoTransaction

對應著不同的數據庫持久層實現,兩個接口分別對應著不同實現;

查看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);
    }
  }

那么DaoTransactionManager以什么依據進行事務管理呢?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;
  }

看到這段代碼就非常清楚了,每調用ibatis DAO的一次方法時,如果不顯式的調用daoManager.startTransaction(),就會成為單獨的一個事務。再看看ibatis為我們提供的摸板JdbcDaoTemplate。

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
 
  這里是一個事務源的情況,如果多個事務源之間要完成全局事務,還是老老實實用分布式事務管理服務吧。

 

【編輯推薦】

  1. ibatis官方提示文檔中的錯誤
  2. ibtis配置之添加ibatis Dao支持
  3. 分析ibatis dao框架
  4. ibatis DAO入門進階寶典
  5. 了解iBatis.Net中的ResultMap

【責任編輯:桑丘 TEL:(010)68476606】

責任編輯:桑丘 來源: 心情小站的blog
相關推薦

2009-07-20 18:00:16

iBATIS DAO事

2025-02-08 10:56:18

2009-07-16 09:14:26

iBATIS DAO

2009-07-16 17:01:32

ibatis dao

2009-06-03 10:20:11

Hibernate事務管理配置

2009-06-30 16:57:42

Spring事務管理

2023-10-08 08:28:10

Spring事務管理

2009-06-17 14:57:11

Spring事務管理

2009-07-16 16:27:33

ibatis DAO

2009-09-25 12:59:53

Hibernate事務

2022-08-04 08:46:16

單體架構微服務事務管理

2009-07-21 13:08:08

iBATIS DAO

2009-09-29 09:44:52

Hibernate事務

2009-09-23 17:48:00

Hibernate事務

2014-08-25 09:12:47

Spring事務管理

2009-06-08 17:56:00

SpringJDBC事務

2023-03-27 10:40:09

2009-07-21 11:17:46

iBATISDAO的配置

2009-06-17 14:43:47

Spring框架Spring事務管理

2009-07-22 13:32:43

iBATIS DAO
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 91精品国产乱码久久久久久久久 | 成人午夜看片 | 国产1区2区 | 亚洲第一在线视频 | 亚洲欧洲视频 | 国产精品视频在线免费观看 | 麻豆久久精品 | 羞视频在线观看 | 亚洲精品一区中文字幕乱码 | 2019天天操 | 国产精品日韩欧美一区二区三区 | 欧洲成人 | 日韩成人在线观看 | 成人亚洲网 | 三级在线视频 | 日本理论片好看理论片 | 三级av在线 | 一区二区视频在线 | 亚洲人在线播放 | 国产精品1区 | 日韩电影中文字幕 | 亚洲欧美日韩激情 | 精品国产一级 | 日本中文字幕在线观看 | 国产精品日产欧美久久久久 | 久久久www成人免费无遮挡大片 | 亚洲欧美成人在线 | 精品成人佐山爱一区二区 | 日韩欧美一区在线 | 美女中文字幕视频 | 日韩精品一区二区三区视频播放 | 欧美一级黄色网 | 日韩成人在线观看 | 日韩视频一区 | 国产免费xxx| 第一av | 午夜精品久久久 | 伊人久久在线 | 国产高清视频一区二区 | 天天插天天狠天天透 | 中文字幕一区二区三区乱码在线 |