2014-10-07 50 views
0

我得到奇怪的事情,因爲更新到EF6,不相信這是相關或不相關,但曾經是很好的處置不工作,許多死連接

我做了一組工作,然後將其保存到DB,然後做另一個,保存另一個。

過了一段時間,我通過sp_who2檢查SQL服務器,發現我的電腦有很多死連接。

工作是巨大的,然後有700個連接, 我必須在手動週期中全部殺死它們。

程序,如:

while (jobDone == false) 
{ 
    var returnData=doOneSetJob(); 
    myEntity dbconn= new myEntity; 

    foreach(var one in retrunData) 
    { 

     dbconn.targetTable.add(one); 
     try 
     { 
      dbconn.savechange(); 
      /// even i put a dispose() here , still lots of dead connections 
     } 
     catch 
     { 
      console.writeline("DB Insertion Fail."); 
      dbconn.dispose(); 
      dbconn= new myEntity(); 
     } 
    } 

    dbconn.dispose() 
} 

回答

2

你應該考慮重構你的代碼,以便您的連接清理作業完成後。例如:

using (var context = new DbContext()) 
{ 
     while (!jobDone) 
     { 
      // Execute job and get data 
      var returnData = doOneSetJob(); 

      // Process job results 
      foreach (var one in returnData) 
      { 
       try 
       { 
        context.TargetTable.Add(one); 
        context.SaveChanges(); 
       } 
       catch (Exception ex) 
       { 
        // Log the error 
       } 
      } 
     } 
} 

using聲明將保證你的背景下進行適當的清理,即使當你通過循環的結果出現錯誤。

1

在這種情況下,您應該使用using聲明。取自MSDN

using語句確保即使在對象上調用方法時發生異常,也會調用Dispose。將對象放在try塊中,然後在finally塊中調用Dispose,可以獲得相同的結果;實際上,這是編譯器如何翻譯using語句。

所以,你的代碼應該是這樣的美好:

using(var dbconn = new DbContext()) 
{ 
    while (!jobDone) 
    { 
     foreach(var one in retrunData) 
     { 
      try 
      { 
       targetTable row = new TargetTable(); 
       dbconn.TargetTable.add(row); 

       dbconn.SaveChanges(); 
      } 
      catch (Exception ex) 
      { 
       Console.WriteLine("DB Insertion Fail."); 
      } 
     } 
    } 
} 

這樣,即使你的代碼在某一點發生故障,Context,資源和連接將被妥善處置。

+1

我認爲它應該是「var dbconn = new DbContext()」而不是db – failedprogramming 2014-10-07 21:35:14

+0

對不起,忘了編輯上下文 – Jhon 2014-10-07 21:37:01