2013-03-27 69 views
0

我有一個Linq-to-SQL DataClasses對象,我用它來進行數據庫調用。我把它包像這樣:Linq-to-SQL DataClasses連接如何關閉?

public class DataWrapper { 

    private DataClassesDataContext _connection = null; 
    private static DataWrapper _instance = null; 
    private const string PROD_CONN_STR = "Data Source=proddb;Initial Catalog=AppName;User ID=sa;Password=pass; MultipleActiveResultSets=true;Asynchronous Processing=True"; 

    public static DataClassesDataContext Connection { 
     get { 
     if (Instance._connection == null) 
      Instance._connection = new DataClassesDataContext(DEV_CONN_STR); 

     return Instance._connection; 
     } 
    } 

    private static DataWrapper Instance { 
     get { 
     if (_instance == null) { 
      _instance = new DataWrapper(); 
     } 
     return _instance; 
     } 
    } 
    } 

我用這個包裝,使存儲過程調用幾個線程,就像這樣:

DataWrapper.Connection.Remove_Message(completeMessage.ID); 

在極少數情況下,我的數據類對象將拋出例外:

ExecuteNonQuery需要一個開放且可用的Connection。連接的當前狀態將關閉。

我沒有以任何方式管理連接的狀態 - 我認爲Linq-to-SQL應該處理這個問題。每次撥打電話時我都可以檢查Connection的連接狀態,如果它已關閉但是看起來像是黑客,則可以打開它。

我試過把MultipleActiveResultSets=trueAsynchronous Processing=True放在連接字符串上,試圖處理SQL強行關閉連接的可能性,但這似乎沒有幫助。

任何想法?

+1

爲什麼不打開連接,進行調用,然後關閉連接並讓底層的ADO.NET處理連接池?你沒有發佈任何你的代碼用於實際的調用 - 我認爲一個簡單的使用塊與上下文將照顧關閉部分。我並沒有在EF上打太多的比賽,所以我可能會離開這裏。 – Tim 2013-03-27 18:19:21

+0

讓我猜,這是網絡應用程序... – leppie 2013-03-27 18:48:08

+0

@Tim我不知道。我不這麼認爲。喬恩Skeet的答案[這裏](http://stackoverflow.com/a/400888/84873)似乎意味着DataClasses對象應該足夠聰明來處理它。 – Daniel 2013-03-27 18:48:20

回答

1

不應該緩存並重新使用DB連接對象...尤其是來自多個線程。

應該打開一個連接,每次需要訪問數據庫時執行您的操作並關閉連接。

底層數據庫訪問基礎架構(ASP.NET/OLEDED)將以這種方式管理連接池,從而將大多數重新連接成本降低到(有效)爲零。

+0

謝謝。您是否知道提供這些說明的任何文檔? – Daniel 2013-03-27 18:51:21

+0

對遲交的道歉。 [MSDN文檔](http://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.110))。aspx)應該給你一個關於最大化連接池優點的最佳方法的很好的概述 – 2013-12-06 06:19:42