Dot-Net
.NET、SqlConnection 對象和多執行緒
我們有一個使用 SQL Server 2008 R2 數據庫的應用程序。在應用程序中,對數據庫的呼叫是使用
SqlConnection對象進行的。這個
SqlConnection對像被初始化一次,第一次被訪問,然後在整個應用程序中重新使用。我們使用的操作如下:Protected _cn As SqlConnection = Nothing ... Protected Sub Open() If _cn Is Nothing Then _cn = New SqlConnection(_sqlConn) End If If _cn.State = ConnectionState.Closed OrElse _cn.State = ConnectionState.Broken Then _cn.Open() End If End Sub這在程序的正常執行期間工作得很好。但是,應用程序的某些部分以多執行緒方式執行。當執行這些部分之一時,如果執行其他操作,則會經常發生錯誤。
經過一番探勘,我意識到這是因為有時兩個不同的執行緒都試圖使用同一個
SqlConnection對象。所以,在確定了問題之後,我現在需要找到解決方案。
SqlConnection顯而易見的解決方案是每次數據庫呼叫需要一個對象時重新創建對象——在這種情況下,它永遠不會被共享。有什麼理由不這樣做嗎?出於性能原因,我最初假設應用程序的每個會話只有一個連接對象,但實際上是這樣嗎?如果我們確實需要只打開一個連接對象,建議的解決方案是什麼?我應該放置某種計時器,它會一直循環直到連接對象可用,然後訪問它?
顯而易見的解決方案是每次數據庫呼叫需要一個時重新創建 SqlConnection 對象——在這種情況下,它永遠不會被共享。有什麼理由不這樣做嗎?
相反,這絕對是你應該做的。
SqlConnection這就是設計的行為。您應該使用Using語句在您使用它的塊的末尾自動關閉連接,連接池機制將自動處理與數據庫的真正底層連接。