Connection Pooling之SqlDataReader.Close()測試
| | 1 | | ![]() |
早上貼了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 嗯...我還是來去重新檢查一番好了^^"