<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    zhyiwww
    用平實的筆,記錄編程路上的點點滴滴………
    posts - 536,comments - 394,trackbacks - 0
    通常我們會把事務處理放在業務層。

    [1]引子

    比如:
    業務邏輯方法

    public A bussinessMethod(){

       DaoA   a = new DaoA();
       a.udpate();

       DaoB  b = new DaoB();
       b.update;

    }

    假設,上面的事務是自動提交的。
    那么,我們就可以什么不考慮。但是有一個問題,創建DAO對象的時候兩個對象用的是不同的Connection對象。

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

        public Connection getConnection(String username, String password)
                throws SQLException {
            Connection con = DriverManager
                    .getConnection(conStr, username, password);
            return con;
        }

    這個方法的一個調用。

    那么如果,我們需要自己控制事務的開始和結束。
    如何控制呢。
    也許又有了新的方法


    public A bussinessMethod(){

       DaoA   a = new DaoA();
       a.beginTx();
       a.udpate();
       a.endTx();
       a.close();

       DaoB  b = new DaoB();
       b.beginTx();
       b.update;
       b.endTx();
       b.close();
    }

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

    [2]問題
    那么怎么才能實現兩個或多個DAO用同一個事務來控制呢?

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

    [3]方案
    因為當一個業務邏輯要對多個DAO進行處理的時候,此操作屬于同一個線程內。所以,我們希望能把此Connection放在線程內,或者和線程有關聯。
    第一個方案,可以用Map來使現。
    就是Map<Thread,Connection>
    但是這個map維護起來比較麻煩,如果一直put的話,那么這個map隨著系統的運行就會越來越大。

    第二個方案,就是用ThreadLocal
    在任何一個線程內都可以用ThreadLocal來保存一個變量的copy,這樣,如果此對象存在,就可以直接取用。
    如果把Connection存在ThreadLocal也一樣。

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


    [4]實現
    代碼

        private static ThreadLocal<Connection> localCon = new ThreadLocal<Connection>();

        public final static Connection getConnection() throws SQLException {

           
            Connection con = localCon.get();
           
            if(con==null||con.isClosed()){

                con = new OracleJdbcDatasource().getConnection();
               
                localCon.set(con);
            }
           
            return con;
        }


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


    [5]新的事務管理

    public A bussinessMethod(){

       DaoA   a = new DaoA();
       DaoB  b = new DaoB();

       a.beginTx();
       a.udpate();

       b.beginTx();
       b.update;

       a.endTx();
       a.close();

    //   b.endTx();
    //   b.close();

    能實現一樣的效果
      
    }


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

    [6]改進

    上面的方法給人的感覺有點別扭,但是卻能實現事務的統一管理。

    我還要繼續改進。








    |----------------------------------------------------------------------------------------|
                               版權聲明  版權所有 @zhyiwww
                引用請注明來源 http://www.tkk7.com/zhyiwww   
    |----------------------------------------------------------------------------------------|
    posted on 2010-02-11 15:34 zhyiwww 閱讀(1875) 評論(2)  編輯  收藏 所屬分類: j2ee

    FeedBack:
    # re: 事務管理與ThreadLocal
    2010-02-11 17:07 | Evan Wu
    兩個方法使用同一個事務,最好還是把它們合二為一。
    ps: Hibernate中的Connection就是用的ThreadLocal  回復  更多評論
      
    # re: 事務管理與ThreadLocal
    2010-02-12 10:02 | zhyiwww
    曾經,我也用hibernate的sessionFactory創建session,卻不知道為什么要用threadlocal,現在我明白了  回復  更多評論
      
    主站蜘蛛池模板: 国产综合激情在线亚洲第一页| 久久国产精品亚洲一区二区| 性盈盈影院免费视频观看在线一区| 19禁啪啪无遮挡免费网站| 中文字幕视频免费| 免费观看的毛片手机视频| 亚洲国产成人久久笫一页 | 四虎成人精品一区二区免费网站| 亚洲免费黄色网址| 亚洲GV天堂GV无码男同| 国产情侣久久久久aⅴ免费| 成人免费视频网站www| 免费日本黄色网址| 精品日韩亚洲AV无码一区二区三区| 亚洲人成网站色在线观看| 99精品免费视频| 男女啪啪永久免费观看网站| 亚洲国产成人AV网站| AV大片在线无码永久免费| 亚洲色偷偷偷综合网| 久久午夜夜伦鲁鲁片免费无码影视| 亚洲午夜精品国产电影在线观看| 西西大胆无码视频免费| 狠狠色伊人亚洲综合成人| 豆国产96在线|亚洲| 亚洲国产婷婷香蕉久久久久久| 亚洲不卡中文字幕| 曰批视频免费40分钟试看天天| 亚洲va成无码人在线观看| 国产成人免费片在线视频观看| 亚洲一区二区免费视频| 四虎影在线永久免费四虎地址8848aa| 一级做a爱过程免费视| 日本一道本高清免费| 亚洲视频一区二区三区四区| 最近免费中文字幕大全高清大全1 最近免费中文字幕mv在线电影 | 免费a级毛片无码a∨蜜芽试看| 亚洲欧洲日产国码一级毛片| 免费一区二区无码东京热| 国产亚洲精品无码拍拍拍色欲| 亚洲丶国产丶欧美一区二区三区|