日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢(xún)
選擇下列產(chǎn)品馬上在線(xiàn)溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷(xiāo)解決方案
為什么要關(guān)閉數(shù)據(jù)庫(kù)連接,能不能不要啊

首先要說(shuō)明的是連接數(shù)是有限制的:

灌陽(yáng)網(wǎng)站制作公司哪家好,找創(chuàng)新互聯(lián)公司!從網(wǎng)頁(yè)設(shè)計(jì)、網(wǎng)站建設(shè)、微信開(kāi)發(fā)、APP開(kāi)發(fā)、響應(yīng)式網(wǎng)站等網(wǎng)站項(xiàng)目制作,到程序開(kāi)發(fā),運(yùn)營(yíng)維護(hù)。創(chuàng)新互聯(lián)公司2013年開(kāi)創(chuàng)至今到現(xiàn)在10年的時(shí)間,我們擁有了豐富的建站經(jīng)驗(yàn)和運(yùn)維經(jīng)驗(yàn),來(lái)保證我們的工作的順利進(jìn)行。專(zhuān)注于網(wǎng)站建設(shè)就選創(chuàng)新互聯(lián)公司。

代碼如下:

 
 
 
 
  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("打開(kāi)了{(lán)0}個(gè)連接", i); 

運(yùn)行結(jié)果如下:

過(guò)一會(huì)就會(huì)提示打開(kāi)連接超時(shí)了:

可以看到數(shù)據(jù)庫(kù)連接時(shí)有限制的,如果連接不關(guān)閉,而且使用的人比較多,那么系統(tǒng)很快就down掉了。

但是有時(shí)候由于某些原因應(yīng)用程序可能只是幾個(gè)人使用,所以就有人設(shè)計(jì)了:

在應(yīng)用程序啟動(dòng)的時(shí)候打開(kāi)數(shù)據(jù)庫(kù)連接,在應(yīng)用程序關(guān)閉的時(shí)候關(guān)閉數(shù)據(jù)庫(kù)連接

那么使用這種方式有什么問(wèn)題呢?

首先假設(shè)有一張表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開(kāi)始執(zhí)行ExecuteCommand

ExecuteCommand代碼如下:

 
 
 
 
  1. private static void ExecuteCommand(SqlConnection conn, int id) 
  2.     Console.WriteLine("正在執(zhí)行." + 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(); 

運(yùn)行:

可以看到ExecuteNonQuery方法拋出了異常,原因是連接處于關(guān)閉狀態(tài)。

可是我們的連接一直都是open著的啊,并沒(méi)有調(diào)用close,dispose之類(lèi)的方法啊

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

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

再次運(yùn)行:

可以看到還是會(huì)出現(xiàn)連接已關(guān)閉的問(wèn)題。你知道什么原因嗎?

這里是由于多線(xiàn)程環(huán)境引起的。所以需要加鎖。

 
 
 
 
  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("正在執(zhí)行.." + id); 
  8.         Thread.Sleep(100); 
  9.         SqlCommand cmd = new SqlCommand( 
  10.            string.Format("Insert into Nums values('{0}') ", id), conn); 
  11.         cmd.ExecuteNonQuery(); 
  12.     } 

再次運(yùn)行:可以發(fā)現(xiàn)基本沒(méi)問(wèn)題了.

修改Parallel.For的***值上限,要測(cè)試下是否可以長(zhǎng)期執(zhí)行了。

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

一天測(cè)試下來(lái),沒(méi)出現(xiàn)任何問(wèn)題。

結(jié)論:對(duì)于某些只有幾個(gè)人使用的應(yīng)用程序,可以不關(guān)閉數(shù)據(jù)庫(kù)連接,但是在寫(xiě)代碼的時(shí)候***要加上連接是否打開(kāi)的判斷。


標(biāo)題名稱(chēng):為什么要關(guān)閉數(shù)據(jù)庫(kù)連接,能不能不要啊
當(dāng)前URL:http://www.dlmjj.cn/article/cojchce.html