為什么要關(guān)閉數(shù)據(jù)庫連接,能不能不要啊
首先要說明的是連接數(shù)是有限制的:
代碼如下:
- for (int i = 0; i < 10000; i++)
- {
- SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
- AttachDbFilename=""E:\DB\NORTHWND.mdf"";
- Integrated Security=True;Connect Timeout=30;User Instance=True");
- conn.Open();
- Console.WriteLine("打開了{(lán)0}個連接", i);
- }
運(yùn)行結(jié)果如下:
過一會就會提示打開連接超時了:
可以看到數(shù)據(jù)庫連接時有限制的,如果連接不關(guān)閉,而且使用的人比較多,那么系統(tǒng)很快就down掉了。
但是有時候由于某些原因應(yīng)用程序可能只是幾個人使用,所以就有人設(shè)計(jì)了:
在應(yīng)用程序啟動的時候打開數(shù)據(jù)庫連接,在應(yīng)用程序關(guān)閉的時候關(guān)閉數(shù)據(jù)庫連接
那么使用這種方式有什么問題呢?
首先假設(shè)有一張表Nums,表定義如下:
Main代碼如下:
- SqlConnection conn = new SqlConnection(@"Data Source=.\SQLEXPRESS;
- AttachDbFilename=""E:\DB\NORTHWND.mdf"";
- Integrated Security=True;Connect Timeout=30;User Instance=True");
- conn.Open();
- Parallel.For(1, 9999, (id) =>
- {
- ExecuteCommand(conn, id);
- });
就是從1到9999開始執(zhí)行ExecuteCommand
ExecuteCommand代碼如下:
- private static void ExecuteCommand(SqlConnection conn, int id)
- {
- Console.WriteLine("正在執(zhí)行." + id);
- Thread.Sleep(100);
- SqlCommand cmd = new SqlCommand(
- string.Format("Insert into Nums values('{0}') ", id), conn);
- cmd.ExecuteNonQuery();
- }
運(yùn)行:
可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關(guān)閉狀態(tài)。
可是我們的連接一直都是open著的啊,并沒有調(diào)用close,dispose之類的方法啊。
于是在ExecuteCommand前面增加判斷條件:
- if (conn.State != System.Data.ConnectionState.Open)
- conn.Open();
再次運(yùn)行:
可以看到還是會出現(xiàn)連接已關(guān)閉的問題。你知道什么原因嗎?
這里是由于多線程環(huán)境引起的。所以需要加鎖。
- private static object syncObj = new object();
- private static void ExecuteCommand(SqlConnection conn, int id)
- {
- lock (syncObj)
- {
- if (conn.State != System.Data.ConnectionState.Open)
- conn.Open();
- Console.WriteLine("正在執(zhí)行.." + id);
- Thread.Sleep(100);
- SqlCommand cmd = new SqlCommand(
- string.Format("Insert into Nums values('{0}') ", id), conn);
- cmd.ExecuteNonQuery();
- }
- }
再次運(yùn)行:可以發(fā)現(xiàn)基本沒問題了.
修改Parallel.For的***值上限,要測試下是否可以長期執(zhí)行了。
- Parallel.For(1, Int32.MaxValue, (id) =>
- {
- ExecuteCommand(conn, id);
- });
一天測試下來,沒出現(xiàn)任何問題。
結(jié)論:對于某些只有幾個人使用的應(yīng)用程序,可以不關(guān)閉數(shù)據(jù)庫連接,但是在寫代碼的時候***要加上連接是否打開的判斷。
原文鏈接:http://www.cnblogs.com/LoveJenny/archive/2011/08/09/2131664.html
【編輯推薦】