為了解決一個事務的多個數(shù)據(jù)模型使用多個Connection的情況,首先想到的是在執(zhí)行每個原子級數(shù)據(jù)模型的操作的時候直接在方法的參數(shù)中傳進來一個Connection,下一個操作也把這個同一個Connection傳進來,但是這樣帶來的問題有兩個,一是,設計問題,針對數(shù)據(jù)庫的操作DAO的方法中的參數(shù)一般都應該是針對數(shù)據(jù)庫查詢的查詢條件,把Connection放在這里作為參數(shù)顯然不合適;第二,Connection作為多個數(shù)據(jù)模型操作的共享,只在最后一個操作中才被關閉,這對于如果只有單個操作的事務執(zhí)行時,Connection將不會被關閉。    
   
    為了解決這些問題,需要有一個專門生產(chǎn)Connection的類,供DAO層各方法調(diào)用,但是幾個方法如果是同一事務時,他們拿到的Connection應該是同一個;
    
   由此,生產(chǎn)Connection的類,有兩個方法,一是生產(chǎn)Connecton,放到一個容器中,即set方法,二是得到Conneciton,即get方法;

     當同一事務的多個方法調(diào)用時,拿到同一個容器中的Connection即可保證他們拿到的是同一個Connection對象;

     為了保證拿到的是同一個容器,使用類級別的變量,static Hashtable;

      采取static類變量的方式,解決了以上引起的設計問題?    
   
    因為static的方法是位于方法區(qū)中的,多個線程共享,所以又引發(fā)了線程不安全的問題;
    
   
    所以使用API中的ThreadLocal類型的變量,使得多個線程各自擁有自己的一個容器,從而解決了線程不安全的問題。