書本上告訴我們,當執行數據庫操作時,首先需要打開一個數據庫連接,然後執行數據庫操作,最後,再關閉數據庫連接。
使用asp和php編程時都是這樣處理的。
後來使用java+hibernate+mysql,通過hibernate配置連接池,
可直接通過new HibernateEntityLoader().getSession();獲得一個數據庫連接,未曾考慮連接效率或會存在什麼問題。
此前用.Net寫C/S結構的程序,客戶端直接連數據庫,前輩告訴我,SqlConnection不用每次都現打開,可以一直打開,最後才關閉。
我感覺說的非常有道理,每次都執行數據庫操作,開門、關門的豈不是很麻煩,於是採用此種方式。
最近,將寫服務器端,採用WebService方式,客戶端不再直接連接數據庫。
測試時,就發現DataReader未關閉錯誤,雖然沒有使用SqlDataReader,但是還是報錯,想必一個數據庫連接不夠?衝突了?更重要的是隔一段時間,客戶端無法登錄,顯示連接未初始化,雖然我每隔10分鐘激活一下數據庫連接。
於是,增加了10靜態個數據庫連接,每次隨機取一個Open狀態的連接,結果這回客戶端報錯,雖然不同客戶端訪問獲得的SessionID不一樣,但是發現返回的DataTable串了,別的客戶端返回的數據會到另一客戶端。
於是沒辦法,只能老實的用Open和Close。但還是存在疑問,每次都Open和Close是否會影響效率。
今日做了一個測試,循環已完成,第一次時間差異在177毫秒,後來都保持在89毫秒。這下放心了,真應驗了一個網友說的話,Sql Server沒那麼傻,他會管理好自己的連接池。
// 測試數據庫連接打開速度
string connString = "Data Source=127.0.0.1;Initial Catalog=dbname;Integrated Security=False;User Id=it;Password=it";
DateTime startDate = DateTime.Now;
for (int i = 0; i < 10000; i++)
{
SqlConnection conn = new SqlConnection();
conn.ConnectionString = connString;
conn.Open();
SqlCommand comd = new SqlCommand();
comd.Connection = conn;
comd.CommandText = "select getDate()";
comd = null;
conn.Close();
}
Console.WriteLine(DateTime.Now - startDate);