[英]No Way to Close SqlConnection
我知道這是一個老問題。 Google上的數千條聲明稱Connection will be closed in Dispose()
。 但是,誰真的驗證了?
我發現SqlConnection
無法關閉 。 我有一個簡單的程序(左邊有行號)。
class Program
{
static void Main(string[] args)
1 {
2 var connectionString = "Data Source=localhost;Initial Catalog=master;Integrated Security=SSPI;";
3 using (var conn = new SqlConnection(connectionString))
5 {
6 using (var cmd = new SqlCommand("create table #mytable(col1 int);", conn))
7 {
8 conn.Open();
9 cmd.ExecuteNonQuery();
10 }
11 conn.Close();
12 conn.Dispose();
13 }
14 GC.Collect();
15 }
}
我有一個用於檢查活動連接的T-SQL語句
exec sp_who2
我一步一步地跟調試器一起走了,同時,我用sp_who2
檢查了活動連接。
每個人都期望連接應該在第11行關閉。對嗎? 但是,連線在第11行之后處於sleep
。
好的,嘗試下一行手動處理。 但在第12行之后,連接仍然處於sleep
。
好的,下一行是自動處理。 但在第13行之后,連接仍處於sleep
。
好的,它可能與GC
。 所以我明確地運行GC.Collect()
來嘗試收集conn
對象。 但是在第14行之后,連接仍處於sleep
。
連接實際上在第15行之后關閉 。 這意味着計划的結束。
在上面的程序中,創建了臨時表#mytable
。 但是,只有在關閉連接時才會刪除臨時表。 我們面臨的問題是too many temp tables are in the database
有too many temp tables are in the database
。 (是的,我知道臨時表應該在使用后丟棄。)
我也試過
使用{ }
創建一個新的范圍來包裝連接。 結果是一樣的。
創建一個新線程以連接到數據庫服務器。 結果也是一樣的。
use while(true) { Thread.Sleep(1000); GC.Collect(); }
while(true) { Thread.Sleep(1000); GC.Collect(); }
while(true) { Thread.Sleep(1000); GC.Collect(); }
在的末端Main
方法。 結果也是一樣的。
上面沒有一個可以關閉SqlConnection。 如何關閉連接?
默認情況下啟用ADO.NET中的連接池。 這意味着當您“處置”您的連接時,您只是將其返回到池中。 當您退出程序時,您顯然最終會從池中釋放所有內容。 如果要避免這種情況,則必須選擇退出連接池。
要禁用,請將Pooling=false
參數添加到連接字符串:
var connection = new SqlConnection(
@"Data Source=(local)\SQLEXPRESS;Initial Catalog=TEST;Integrated " +
"Security=SSPI;Pooling=false;");
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.