簡體   English   中英

持久數據庫連接與打開和關閉

[英]Persistant db connection vs opening & closing

我有一個sql server 2k8數據庫,每天填充數十萬條記錄。

我正在編寫一些代碼,它們將調用db,檢索n條記錄,處理它們,並將一些數據寫回db。

我有兩種方法可以做到這一點(偽代碼):

function xyz() {
    conn = conn creation code
    conn.open();
    while(not last record) {
        select next 1000 records
        process each record
        last record = true
    }
    conn.close();
    xyz();
}

基本上每批創建一個連接。 第二種方法:

function xyz() {
    conn = connection creation code
    while(conn.open();) {
        select next 1000 records
        process each record
        last record = true
    }
    conn.close();
    xyz();
}

我很好奇什么是更好的做法。 我覺得它是后者,但它也會與我的數據庫建立一個或多或少的永久/持久連接。 我擔心可能的內存超支或其他一些問題。

思考?

斯科特

ADO.Net Sqlclient提供程序(我假設您將使用,因為您說是C#)自動執行連接池,請參閱SQL Server連接池(ADO.NET) 當您調用Close時,池連接不會真正關閉,它們只是返回池中。 '開放'和'關閉'匯集連接非常快。

不相關的注意事項:您應該在using塊中嵌入您的連接:

using (SqlConnection conn = new SqlConnection(...))
{
   conn.Open ();
   ...
}

這樣可以避免在異常情況下泄漏連接。

我將處理函數外部的連接並將其傳入。該函數用於處理條目,而不是連接到數據庫和進程條目。 我會將這兩份工作分開。

連接打開/關閉:是的,你應該避免它。 它本身並不是非常慢,但如果您只是在進行處理,則沒有理由一遍又一遍地打開/關閉連接。 如果它是由於內存使用(我不太熟悉C#,所以這部分可能只是錯誤),你應該釋放結果集。 關閉連接將釋放與其關聯的內存,但是,您應該能夠獲得相同的效果,而無需重新連接。

這取決於“處理每條記錄”的含義。 如果這需要花費大量時間並且不需要維護連接,您可能需要重新考慮保持連接打開並讓池處理它。

但如果它不斷地從連接讀取/連接,則不應人為地斷開/重新連接。

沒有理由繼續關閉並重新打開連接。 它對數據庫和網絡造成了不必要的負擔。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM