為什麼要關閉資料庫連接,能不能不要啊

來源:互聯網
上載者:User

首先要說明的是串連數是有限制的:

代碼如下:

 
  1. for (int i = 0; i < 10000; i++) 
  2.     SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; 
  3.                 AttachDbFilename=""E:\DB\NORTHWND.mdf""; 
  4.                 Integrated Security=True;Connect Timeout=30;User Instance=True"); 
  5.  
  6.     conn.Open(); 
  7.     Console.WriteLine("開啟了{0}個串連", i); 

運行結果如下:

過一會就會提示開啟連線逾時了:

可以看到資料庫連接時有限制的,如果串連不關閉,而且使用的人比較多,那麼系統很快就down掉了。

但是有時候由於某些原因應用程式可能只是幾個人使用,所以就有人設計了:

在應用程式啟動的時候開啟資料庫連接,在應用程式關閉的時候關閉資料庫連接

那麼使用這種方式有什麼問題呢?

首先假設有一張表Nums,表定義如下:

Main代碼如下:

 
  1. SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS; 
  2.                     AttachDbFilename=""E:\DB\NORTHWND.mdf""; 
  3.                     Integrated Security=True;Connect Timeout=30;User Instance=True"); 
  4. conn.Open(); 
  5. Parallel.For(1, 9999, (id) => 
  6.     ExecuteCommand(conn, id); 
  7. }); 

就是從1到9999開始執行ExecuteCommand

ExecuteCommand代碼如下:

 
  1. private static void ExecuteCommand(SqlConnection conn, int id) 
  2.     Console.WriteLine("正在執行." + id); 
  3.  
  4.     Thread.Sleep(100); 
  5.  
  6.     SqlCommand cmd = new SqlCommand( 
  7.        string.Format("Insert into Nums values('{0}') ", id), conn); 
  8.  
  9.     cmd.ExecuteNonQuery(); 

運行:

可以看到ExecuteNonQuery方法拋出了異常,原因是串連處於關閉狀態。

可是我們的串連一直都是open著的啊,並沒有調用close,dispose之類的方法啊

於是在ExecuteCommand前面增加判斷條件:

 
  1. if (conn.State != System.Data.ConnectionState.Open) 
  2.     conn.Open(); 

再次運行:

可以看到還是會出現串連已關閉的問題。你知道什麼原因嗎?

這裡是由於多線程環境引起的。所以需要加鎖。

 
  1. private static object syncObj = new object(); 
  2. private static void ExecuteCommand(SqlConnection conn, int id) 
  3.     lock (syncObj) 
  4.     { 
  5.         if (conn.State != System.Data.ConnectionState.Open) 
  6.             conn.Open(); 
  7.         Console.WriteLine("正在執行.." + id); 
  8.         Thread.Sleep(100); 
  9.         SqlCommand cmd = new SqlCommand( 
  10.            string.Format("Insert into Nums values('{0}') ", id), conn); 
  11.         cmd.ExecuteNonQuery(); 
  12.     } 

再次運行:可以發現基本沒問題了.

修改Parallel.For的最大值上限,要測試下是否可以長期執行了。

 
  1. Parallel.For(1, Int32.MaxValue, (id) => 
  2.             { 
  3.                 ExecuteCommand(conn, id); 
  4.             }); 

一天測試下來,沒出現任何問題。

結論:對於某些只有幾個人使用的應用程式,可以不關閉資料庫連接,但是在寫代碼的時候最好要加上串連是否開啟的判斷。

相關文章

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.