2008-10-29 53 views
8

似乎有很多開銷涉及快速打開和關閉sqlconnections。我應該堅持一個連接(每個客戶端,每個數據庫一個連接),還是在我需要的時候繼續聲明一個新的sqlconnection對象,並確保自己清理完畢?我應該在我的數據訪問層中堅持sqlconnection嗎?

你做了什麼?什麼效果好,什麼效果不好?

+0

何時連接在游泳池超時? – 2008-10-29 15:46:08

+0

您可以通過connectionstring名稱/值來控制它:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。向下滾動到包含「連接壽命」的第二個表格。 – 2008-10-29 16:08:50

回答

21

在大多數情況下,.NET連接池爲您處理此問題。即使你通過代碼打開和關閉連接,這不是幕後發生的事情。當您實例化並打開連接時,.NET將使用相同的連接字符串查找連接池中的現有連接,併爲您提供相同的連接。當您關閉連接時,它將返回到連接池以供將來使用。

如果您使用的SQL Server:http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx

OLE DB,ODBC,甲骨文:http://msdn.microsoft.com/en-us/library/ms254502.aspx

迪諾·埃斯波西託文章:http://www.wintellect.com/Articles/ADO%20NET%20Connection.pdf

您可以覆蓋與ConnectionString的名稱/值默認池的行爲: http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。查看包含'連接壽命'的第二個設置表。

4

如果您使用相同的連接字符串,您將連接到連接。只要你需要它,你只應該打開一個連接。

5

由於默認設置,池存儲在連接池中,所以沒有太多開銷。因此,當您打開連接時,通常您只需從池中獲得現成的連接。創建SqlConnections並沒有給我任何麻煩。

1

我的確有同樣的想法,所以我在緊密循環中使用了相同的連接,以防止在需要時實例化另一個連接。但有時很難跟蹤它並進行調試,如果您將DataReader從連接中取出,然後嘗試在同一個讀取器仍處於活動狀態時再執行一次,則會發生異常。所以,我只會推薦它,如果它確實頻繁像一個緊密的循環,否則它是不值得的麻煩。

1

這通常不是一件好事(你可能會導致泄漏並最終用完連接),而是依賴於連接池來提高性能並根據需要打開連接,並儘可能快地關閉連接。

比爾·沃恩有很多關於連接池和包括this one

0

數據訪問有用的文章多年來,我們有客戶存到數據庫中的一個永久連接。問題在於檢測到間歇性連接失敗並正常重新連接。通常你不會知道連接失敗,直到你嘗試使用它(例如發出一個select會拋出一個'General SQL Error')

我們現在使用一個全局可用的靜態類,它的工作是給你一個與數據庫的新連接,當你完成它時,你使用相同的類來擺脫連接。

DbConnection conn = Database.GetConnection(); 
try 
{ 
    //do stuff with the connetion 
    ... 
} 
finally 
{ 
    Database.DisposeConnection(conn); 
} 

我們做到這一點,因爲有當我們連接到數據庫所需的初始化(我們存儲的信息是SQL Server的CONTEXT_INFO,當我們斷開必須清空該信息)

相關問題