2011-07-20 41 views
7

從我的理解來看,.Net會將SqlConnection對象的連接字符串默認設置爲相同的對象。如果我調用Dispose方法,連接仍然會被合併嗎?SqlConnection的Dispose方法會干擾連接池嗎?

在ASP.NET應用程序的上下文中詢問此問題,該應用程序有時會在單個PageLoad事件中向數據庫發出多次命中。我希望將連接集中起來,但希望確認數據操作完成後關閉和處理連接不會影響.NET處理連接池。

回答

10

使用連接池時,關閉SqlConnection只是告訴連接池您已完成連接池。然後池將決定是否實際關閉連接或重新使用連接。

MSDN docs

如果的SqlConnection超出範圍,它不會被關閉。因此,您必須通過調用Close或Dispose來顯式關閉連接。 Close和Dispose在功能上是等效的。如果連接池值Pooling設置爲true或yes,則將底層連接返回到連接池。另一方面,如果將Pooling設置爲false或否,則關閉到服務器的基礎連接。

3

SQL Server Connection Pooling MSDN文檔說

連接被釋放回池中時,它們被關閉或 配置

我們強烈建議您當您的 是f時,請始終關閉連接使用它,以便連接將返回到 池。你可以做到這一點使用或者關閉或Dispose Connection對象的方法...

而且,它是的連接池,來決定是否將連接從池中刪除

的的連接池去除池中的連接已 空閒了很長一段時間後,或者如果池程序檢測到與服務器的 連接已中斷

1

從我的理解,.NET可以凝聚的SqlConnection對象

沒有,SQL供應商將彙集到SQL Server的基本連接(基於連接字符串單獨的池)。

SqlConnection對象將獲得一個池的連接(或創建一個新的,等的基礎上,什麼配置池,池連接是否可用)時Open被調用時,會釋放連接時CloseDispose是調用。

這兩個概念(SqlConnection對象和實際連接到SQL Server)是不同的,但顯然有些相關。

+0

關於你的第一點這是我的想法,但我在我的答案中指出的MSDN文檔似乎不明確「創建池時,會創建多個連接*對象*並將其添加到池中,以便最小池大小需求滿足「和」當請求SqlConnection對象時,如果可用連接可用,則從池中獲取它「??我認爲這是誤導,因爲它與文檔中的某些觀點相矛盾。 –

+0

@cpedros - 是的,我會說這是誤導 - 它是「連接對象」(模糊的底層連接)和「SqlConnection對象」 - 「SqlConnection」 s是管理對象,您可以創建它們的10000個,所有共享一個連接字符串與Max Pool = 100。當您嘗試同時打開所有這些文件時,它會失敗。 –