2009-03-04 60 views
3

我目前正在用ASP.NET創建一個webportal,它嚴重依賴於數據庫的使用。基本上,任何用戶的每個(幾乎每一個:P)GET查詢都會導致從Web服務器向數據庫進行查詢。打開數據庫連接一次或每次數據庫操作?

現在,我真的很新,而且我非常關心性能。由於我在這方面缺乏經驗,所以我不知道會發生什麼。

我的問題是,使用ADO.NET,將一個靜態連接從Web服務器打開到數據庫,然後在每次查詢數據庫之前檢查此連接的完整性,是否更明智? - 或者,我最好在每次查詢之前打開連接,然後關閉它?

在我的腦海中,第一個選項會更好,因爲在每次查詢之前您節省了握手等時間,並且既節省了數據庫和服務器端的內存,又節省了一次連接,進場? 2個查詢可能同時發送可能破壞其他完整性或混合返回的數據集?

我試過在這裏和在網上到處尋找關於這方面的一些最佳實踐,但沒有運氣。最近我得到了這樣的:is it safe to keep database connections open for long time,但似乎更適合分佈式系統,其中你有多個用戶的數據庫,而我只有我的網絡服務器..

回答

8

你很早就擔心性能。

無論如何,連接是由框架彙集的。你應該打開它們,使用它們,儘快處理它們。

喜歡的東西...

public object Load() 
{ 
    using (SqlConnection cn = new SqlConnection(connectionString)) 
    using (SqlCommand cm = new SqlCommand(commandString, cn)) 
    { 
    cn.Open(); 
    return cm.ExecuteScalar(); 
    } 
} 
3

最好讓ADO.NET處理連接池。如果認爲需要,它會保持連接,但不要使用靜態連接對象。這只是聞起來。最好將連接對象傳遞給需要它的方法,並在using塊中創建連接。

1

你應該總是關閉整理你的數據庫交互之後的連接。 ADO.NET具有連接池功能,可以有效地連接重用。每當你打開第二,第三和後續連接 - 他們將從一個幾乎沒有開銷的游泳池中被帶走。

希望這會有所幫助。

0

ADO.NET確實連接池。當您在連接對象上調用close時,它將保持池中的連接,使下一個連接快得多。

0

你絕對不想爲每個數據庫調用打開一個連接,這將導致非常快速的非常差的性能。建立數據庫連接非常昂貴。

而應該使用的是連接池。該池將管理您的連接,並嘗試在可能的情況下重新使用現有連接。

+0

這聽起來像他應該自己做。但讓ADO.Net做他的工作將是最好的。 – BendEg 2015-08-25 14:37:28

0

我不知道你的平臺,但看看連接池 - 必須有一個庫或實用程序可用(無論是在基本系統或作爲附加件,或提供數據庫驅動程序)將提供將多個活動連接集中到數據庫的方法,這些連接已準備就緒,並且在您從池中獲得一個時可以使用。

說實話,我期望在任何數據庫抽象庫(有一個可用的選項來禁用它)默認情況下發生池。看來,ADO.NET這樣做。

-2

真的要問的第一個問題是爲什麼你是否非常關心性能?你預期的工作量是多少?你試過了嗎?

但是總體來說,是的,擁有一段時間的開放連接比每次重新打開數據庫連接更聰明一點;取決於連接的類型,網絡問題和月球的相位,它可能需要一秒或更長時間才能建立初始連接;如果你的工作量是每隔五秒左右就會得到一次以上的GET,那麼你會更快樂地站在一起。

+0

連接池做得更好。如果您要建立長期聯繫,那會是:每個客戶?每線程?按應用程序? 「我的第一個asp.net應用程序」保持一個連接打開並通過它。切換到打開狀態,執行關閉操作,可節省數小時的應用程序時間。 – 2009-03-04 15:30:23

+0

我說什麼不同意? – 2009-03-04 18:31:03

1

我會比高級連接池更多地考慮緩存。每一次獲得都需要數據庫命中?

如果您的門戶網站擁有共同的內容和用戶特定的內容,則可以使用緩存存儲常用項目以及損壞的密鑰(使用用戶標識),您可以存儲用戶特定的項目。