早上貼了OracleConnection Pooling觀察文後,引發另一個疑問:

那麼沒呼叫SqlDataReader.Close()也會有相同問題嗎?

程式經過修改,就做出了SQL版:

public static void ShowSessionCount(string tag)
{
    using (SqlConnection cn = new SqlConnection(cnStrMonitor))
    {
        cn.Open();
        SqlCommand cmd = new SqlCommand(@"
select count(*) as c 
from sys.sysprocesses where loginame = 'testCnnUser'",
            cn);
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();
        Console.WriteLine("[{1}] Session Count={0}", dr["c"], tag);
        dr.Close();
        cn.Close();
    }
}
 
public static void TestConnPool()
{
    using (SqlConnection cn = new SqlConnection(cnStrTester))
    {
        ShowSessionCount("Before Open");
        cn.Open();
        ShowSessionCount("After Open");
        SqlCommand cmd = new SqlCommand(
            "select getdate()", cn);
        SqlDataReader dr = cmd.ExecuteReader();
        dr.Read();
        Console.WriteLine(dr[0]);
        //dr.Close();
        SqlConnection.ClearPool(cn);
        ShowSessionCount("Before Close");
        cn.Close();
        ShowSessionCount("After Close");
    }
    ShowSessionCount("After Using");
    SqlConnection.ClearAllPools();
    ShowSessionCount("After ClearAllPools");
}

用我的工作機Windows 2008 + VS 2008 + SQL 2008進行測試,發現SqlDataReader.Close()不影響Connection的釋放。

[Before Open] Session Count=0
[After Open] Session Count=1
2009/08/12 上午 09:22:16
[Before Close] Session Count=1
[After Close] Session Count=0
[After Using] Session Count=0
[After ClearAllPools] Session Count=0

不過,DataReader用完就Close()絕對是好習慣,不要過度依賴系統的防呆機制,肯定是良好的開發態度。

如果有人有其他平台的測試結果,歡迎留言跟大家分享。


Comments

# by 小賤健

Win 2K3 + VS 2K5 + SQL 2K5 結果也一樣。 其實這問題,很久之前我已經有測試過了,得到的答案與黑大一樣。不過也因為知道 DataReader 與 Connection 是共生,所以很多時候都是在偷懶狀態,多數情況下只有釋放 Conntection 而不做 DataReader.Close() 的:P 嗯...我還是來去重新檢查一番好了^^"

Post a comment