簡體   English   中英

無法關閉SqlConnection

[英]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 databasetoo many temp tables are in the database (是的,我知道臨時表應該在使用后丟棄。)

我也試過

  1. 使用{ }創建一個新的范圍來包裝連接。 結果是一樣的。

  2. 創建一個新線程以連接到數據庫服務器。 結果也是一樣的。

  3. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM