91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行iBATIS DAO事務淺析

發布時間:2021-12-18 21:19:33 來源:億速云 閱讀:275 作者:柒染 欄目:編程語言

怎么進行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(),則每個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;  }

看到這段代碼就非常清楚了,每調用DAO的一次方法時,如果不顯式的調用daoManager.startTransaction(),就會成為單獨的一個iBATIS DAO事務。再看看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

這里是一個事務源的情況,如果多個事務源之間要完成全局事務,還是老老實實用分布式事務管理服務吧(jta)。

關于怎么進行iBATIS DAO事務淺析問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

延长县| 涿州市| 鸡东县| 绥阳县| 建始县| 洞口县| 宁安市| 江达县| 桓台县| 繁昌县| 磴口县| 灌云县| 昭苏县| 祁阳县| 房山区| 化州市| 盱眙县| 南宁市| 茌平县| 商南县| 盘山县| 苍溪县| 曲阳县| 建宁县| 长武县| 沁源县| 嘉兴市| 湄潭县| 曲周县| 双辽市| 岢岚县| 枞阳县| 阜平县| 高碑店市| 安丘市| 昌吉市| 二连浩特市| 句容市| 灌云县| 怀来县| 同仁县|