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 嗯...我還是來去重新檢查一番好了^^"