ThreadLocal與事務

來源:互聯網
上載者:User

ThreadLocal中放置connection, 保證事務中的DAO類擷取的都是同一個connection,這樣才保證事務。

下面是網上找到的一個具體的例子http://www.pin5i.com/showtopic-26854.html

-----------------------------------------------------------------------------------

通常我們會把交易處理放在業務層。

[1]引子

比如:
商務邏輯方法

  1. public A bussinessMethod(){
  2.   DaoA  a = new DaoA();
  3.   a.udpate();
  4.   DaoB  b = new DaoB();
  5.   b.update;
  6. }

複製代碼

假設,上面的事務是自動認可的。

那麼,我們就可以什麼不考慮。但是有一個問題,建立DAO對象的時候兩個對象用的是不同的Connection對象。

再假定我們的取得串連的代碼是

  1.     public Connection getConnection(String username, String password)
  2.             throws SQLException {
  3.         Connection con = DriverManager
  4.                 .getConnection(conStr, username, password);
  5.         return con;
  6.     }

複製代碼

這個方法的一個調用。

那麼如果,我們需要自己控制事務的開始和結束。

如何控制呢。

也許又有了新的方法

  1. public A bussinessMethod(){
  2.   DaoA  a = new DaoA();
  3.   a.beginTx();
  4.   a.udpate();
  5.   a.endTx();
  6.   a.close();
  7.   DaoB  b = new DaoB();
  8.   b.beginTx();
  9.   b.update;
  10.   b.endTx();
  11.   b.close();
  12. }

複製代碼

這樣我們就控制了事務,並且我們也只有這樣才能實現,因為,不同的DAO取得的是不同的Connection對象。

[2]問題

那麼怎麼才能實現兩個或多個DAO用同一個事務來控制呢?

首先就要解決一個根本問題,我們在一個事務中,不同的DAO取得的是同一個Connection,這個要怎麼實現呢。我們想到了TheadLocal.

[3]方案

因為當一個商務邏輯要對多個DAO進行處理的時候,此操作屬於同一個線程內。所以,我們希望能把此Connection放線上程內,或者和線程有關聯。

第一個方案,可以用Map來使現。

就是Map<Thread,Connection>

但是這個map維護起來比較麻煩,如果一直put的話,那麼這個map隨著系統的運行就會越來越大。

第二個方案,就是用ThreadLocal

在任何一個線程內都可以用ThreadLocal來儲存一個變數的copy,這樣,如果此對象存在,就可以直接取用。

如果把Connection存在ThreadLocal也一樣。

所以,在同一個線程內,就可以保證取得到的是同一個Connection.

[4]實現

  1.     private static ThreadLocal<Connection> localCon = new ThreadLocal<Connection>();
  2.     public final static Connection getConnection() throws SQLException {
  3.      
  4.         Connection con = localCon.get();
  5.      
  6.         if(con==null||con.isClosed()){
  7.             con = new OracleJdbcDatasource().getConnection();
  8.          
  9.             localCon.set(con);
  10.         }
  11.      
  12.         return con;
  13.     }

複製代碼

這樣就實現了上面的問題。

[5]新的交易管理

  1. public A bussinessMethod(){
  2.   DaoA  a = new DaoA();
  3.   DaoB  b = new DaoB();
  4.   a.beginTx();
  5.   a.udpate();
  6.   b.beginTx();
  7.   b.update;
  8.   a.endTx();
  9.   a.close();
  10. //  b.endTx();
  11. //  b.close();
  12. 能實現一樣的效果
  13.  
  14. }

複製代碼

上面的黑體部分,就可以實現對事務的統一管理。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.