群里有朋友問起連接池在密碼修改后的變化,特地做了下測試
使用連接池,連接字符串為:
string connString = "Data Source=.;Initial Catalog=DemoDB1;Integrated Security=False;User ID=DBA;PassWord=XXXXX;Pooling=True;Connect Timeout=60";
測試1
數據庫連接打開后不斷開(不調用close方法),連續請求
using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); for (int i = 0; i < 100; i++) { SqlCommand comm = conn.CreateCommand(); comm.CommandText = "SELECT COUNT(1) FROM TB2"; comm.CommandType = System.Data.CommandType.Text; Console.WriteLine(comm.ExecuteScalar().ToString()); Console.WriteLine(DateTime.Now.ToString()); System.Threading.Thread.Sleep(1 * 1000); } }
測試結果:修改密碼后,程序沒有任何報錯,對已建立的連接沒有影響
測試2
循環執行請求,每次請求會關閉鏈接(using會調用close方法)
for (int i = 0; i < 100; i++) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand comm = conn.CreateCommand(); comm.CommandText = "SELECT COUNT(1) FROM TB2"; comm.CommandType = System.Data.CommandType.Text; Console.WriteLine(comm.ExecuteScalar().ToString()); Console.WriteLine(DateTime.Now.ToString()); System.Threading.Thread.Sleep(1 * 1000); } }
測試結果:程序運行后,可以使用SQL PRofiler捕獲到exec sp_reset_connection,當密碼修改后,程序立即報錯(在命令執行時報錯)。
測試3
注釋掉執行命令語句,查看conn.Open()是否執行sp_reset_connection
for (int i = 0; i < 100; i++) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand comm = conn.CreateCommand(); comm.CommandText = "SELECT COUNT(1) FROM TB2"; comm.CommandType = System.Data.CommandType.Text; //Console.WriteLine(comm.ExecuteScalar().ToString()); Console.WriteLine(DateTime.Now.ToString()); System.Threading.Thread.Sleep(1 * 1000); } }
測試結果:無法使用SQL Profiler 捕獲到sp_reset_connection
測試4
在重用的連接中執行兩次命令,查看是否調用兩次sp_reset_connection
for (int i = 0; i < 100; i++) { using (SqlConnection conn = new SqlConnection(connString)) { conn.Open(); SqlCommand comm = conn.CreateCommand(); comm.CommandText = "SELECT COUNT(1) AS COUNT1 FROM TB2"; comm.CommandType = System.Data.CommandType.Text; Console.WriteLine(comm.ExecuteScalar().ToString()); Console.WriteLine(DateTime.Now.ToString()); System.Threading.Thread.Sleep(10 * 1000); comm.CommandText = "SELECT COUNT(1) AS COUNT2 FROM TB2"; Console.WriteLine(comm.ExecuteScalar().ToString()); System.Threading.Thread.Sleep(10 * 1000); } }
測試結果:對于重用的連接,無論執行多少次命令,都只調用一次sp_reset_connection
結論:
1.對于第一次打開后的連接,不會調用sp_reset_connection,修改密碼仍然能執行請求,沒有照成影響;
2.對于重用的連接,執行OPEN不會調用sp_reset_connection
3.對于重用的連接,第一次執行命令時sp_reset_connection,后續執行命令不調用sp_reset_connection
4.對于重用的連接,在sp_reset_connection時會驗證,密碼修改后,執行sp_reset_connection會驗證失敗,拋出異常
參考鏈接:http://msdn.microsoft.com/zh-cn/library/8xx3tyca(v=vs.110).aspx
妹子鎮貼:
新聞熱點
疑難解答