似乎有很多開銷涉及快速打開和關閉sqlconnections。我應該堅持一個連接(每個客戶端,每個數據庫一個連接),還是在我需要的時候繼續聲明一個新的sqlconnection對象,並確保自己清理完畢?我應該在我的數據訪問層中堅持sqlconnection嗎?
你做了什麼?什麼效果好,什麼效果不好?
似乎有很多開銷涉及快速打開和關閉sqlconnections。我應該堅持一個連接(每個客戶端,每個數據庫一個連接),還是在我需要的時候繼續聲明一個新的sqlconnection對象,並確保自己清理完畢?我應該在我的數據訪問層中堅持sqlconnection嗎?
你做了什麼?什麼效果好,什麼效果不好?
在大多數情況下,.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。查看包含'連接壽命'的第二個設置表。
如果您使用相同的連接字符串,您將連接到連接。只要你需要它,你只應該打開一個連接。
由於默認設置,池存儲在連接池中,所以沒有太多開銷。因此,當您打開連接時,通常您只需從池中獲得現成的連接。創建SqlConnections並沒有給我任何麻煩。
我的確有同樣的想法,所以我在緊密循環中使用了相同的連接,以防止在需要時實例化另一個連接。但有時很難跟蹤它並進行調試,如果您將DataReader從連接中取出,然後嘗試在同一個讀取器仍處於活動狀態時再執行一次,則會發生異常。所以,我只會推薦它,如果它確實頻繁像一個緊密的循環,否則它是不值得的麻煩。
這通常不是一件好事(你可能會導致泄漏並最終用完連接),而是依賴於連接池來提高性能並根據需要打開連接,並儘可能快地關閉連接。
比爾·沃恩有很多關於連接池和包括this one
數據訪問有用的文章多年來,我們有客戶存到數據庫中的一個永久連接。問題在於檢測到間歇性連接失敗並正常重新連接。通常你不會知道連接失敗,直到你嘗試使用它(例如發出一個select會拋出一個'General SQL Error')
我們現在使用一個全局可用的靜態類,它的工作是給你一個與數據庫的新連接,當你完成它時,你使用相同的類來擺脫連接。
DbConnection conn = Database.GetConnection();
try
{
//do stuff with the connetion
...
}
finally
{
Database.DisposeConnection(conn);
}
我們做到這一點,因爲有當我們連接到數據庫所需的初始化(我們存儲的信息是SQL Server的CONTEXT_INFO,當我們斷開必須清空該信息)
何時連接在游泳池超時? – 2008-10-29 15:46:08
您可以通過connectionstring名稱/值來控制它:http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlconnection.connectionstring.aspx。向下滾動到包含「連接壽命」的第二個表格。 – 2008-10-29 16:08:50