關於connection關閉的時機

來源:互聯網
上載者:User

Class   A:   IDisposable  
  {  
        SqlConnection   conn;  
        function   A1  
        {  
              conn   =   new   SqlConnection(...)  
              conn.open  
            ?conn.close  
        }  
        function   A2  
        {  
              conn....  
          }  
        Dispose  
        {  
            ?conn.close  
        }  
  }  
  函數A1和A2都要用到conn,調用情況為單獨調用A1,或者調用A1,A2。  
  問題是如果在A1中關閉conn,在A2中需要conn.open。  
  那麼在Dispose中關閉conn是否更加好呢? 

 

建議使用SqlConnection的時候,用的時候Open,不用的時候立刻Close

建議你這樣寫  
  Class   A:   IDisposable  
  {  
        SqlConnection   conn;  
        function   A1  
        {  
              conn   =   new   SqlConnection(...)  
              conn.open()  
              conn.close()  
        }  
        function   A2  
        {  
              conn.open()  
              ....  
          }  
        Dispose  
        {  
        }  
  }  
   
  因為你長期儲存一個持續的串連是很耗資源的  
  你調用Close方法後,並不是完全關掉串連  
  串連會回到串連池用  
  下次要使用的時候再調用open就好  
  總之,使用Connection的原則就是儘可能的使用短時間串連  
  要用才開,用完就關 

ljfppp(劉三瘋)回複於 2003-03-11 09:52:16 得分 20

在SqlConnection中,如果你是用DataAdapter.Fill()取資料的話,如果你的連結原先的狀態是Open,則Fill方法執行完後不關閉連結,如果你的串連原先是Close狀態,則Fill方法在開始執行時自動開啟連結,在執行完畢後自動關閉連結,也就是說Fill方法將保持執行前後連結狀態的一致。如果你不是用DataAdapter操作資料庫的話,就要自己執行SqlConnection。Open()方法,然後執行SqlConnection.Close();當然,如果你操作資料庫頻繁的話,則建議你按下面的方式構造類:  
  Class   A:   IDisposable  
  {  
        SqlConnection   conn;  
        function   OpenCon()  
        {  
              conn   =   new   SqlConnection(...)  
              conn.open  
        }  
        function   CloseCon()  
        {  
              conn.Close()  
          }  
        function   YourOperate()  
        {  
            //Execute   your   operate  
        }  
  }  
  這樣就可以減少資料庫開啟和關閉的動作次數,提高效能。  
 

不同意ljfppp(劉三瘋)  
  執行Connection.Close()並不一定會關閉這個串連,只是告訴Framework,我的串連用完了,這樣Framework會把這個串連放回到串連池。  
  當你new   一個串連的時候,只是new   一個connection對象,也不代表一定會重新開一個資料庫連接,因為如果串連池有串連,會直接從串連池抓。  
   
  串連用完就關,這是個原則問題。  
   
  不信可以查看System.Data.Common.DbAdapter,這是DataAdapter的父類,當它Fill資料的時候,也是用完之後立即就關掉了。

 

To   f2k(木頭)    
        資料庫連接的建立很耗資源,而持續串連更耗,所以,使用資料庫連接要儘可能的短,而提高效能是通過串連池來完成的,所以你不必擔心使用一次後,Close串連,下次開啟會很慢,相反,這正是正確的用法。  
        可能,你想知道,串連池是誰來完成的,如何啟用?  
        我可以告訴你,這個是不需要我們手動維護的,不過,你可以在設定ConnectionStr的時候設定是否啟用串連池  
  下面是一些參數資訊,你可以看一下:  
   
  Connection   Lifetime   0   當串連返回到池中時,將對它的建立時間和目前時間進行比較,如果時間間隔超過由   Connection   Lifetime   指定的值(以秒為單位),則會毀壞該串連。在聚集配置中可以使用它來強制在運行伺服器和剛聯機的伺服器之間達到Server Load Balancer。    
  如果值為零   (0),則將使池串連具有最大的逾時期限。  
     
  Connection   Reset   'true'   確定在從池中移除資料庫連接時是否將其重設。對於   Microsoft   SQL   Server   版本   7.0,如果設定為   false,將避免在擷取串連時經曆一個額外的往返行程,但必須注意的是串連狀態(如資料庫上下文)不會被重設。    
  Enlist   'true'   當為   true   時,如果存在事務上下文,池管理程式將自動在建立線程的當前事務上下文中登記串連。    
  Max   Pool   Size   100   池中允許的最大串連數。    
  Min   Pool   Size   0   池中維護的最小串連數。    
  Pooling   'true'   當為   true   時,將從相應的池中取出串連,或者在必要時建立串連並將其添加到相應的池中。    
   
  詳細資料參見  
  ms-help://MS.VSCC/MS.MSDNVS.2052/cpref/html/frlrfsystemdatasqlclientsqlconnectionclassconnectionstringtopic.htm  
  ms-help://MS.VSCC/MS.MSDNVS.2052/cpguide/html/cpconconnectionpoolingforsqlservernetdataprovider.htm

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.