Sql Server數據庫連接是否需要每次都打開?

書本上告訴我們,當執行數據庫操作時,首先需要打開一個數據庫連接,然後執行數據庫操作,最後,再關閉數據庫連接。

使用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);








發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章