C# Linq到SQL数据类的连接是如何关闭的?

C# Linq到SQL数据类的连接是如何关闭的?,c#,sql-server,linq-to-sql,C#,Sql Server,Linq To Sql,我有一个Linq到SQL数据类对象,我利用它来进行数据库调用。我是这样包装的: public class DataWrapper { private DataClassesDataContext _connection = null; private static DataWrapper _instance = null; private const string PROD_CONN_STR = "Data Source=proddb;Initial Catalog

我有一个Linq到SQL数据类对象,我利用它来进行数据库调用。我是这样包装的:

  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);
在极少数情况下,我的DataClasses对象会抛出异常:

ExecuteOnQuery需要打开且可用的连接。这个 连接的当前状态为关闭

我没有以任何方式管理连接的状态——我认为Linq到SQL应该处理这个问题。我可以在每次打电话时检查连接的连接状态,如果它已关闭,则打开它,但这似乎是一次黑客攻击

我尝试在连接字符串上放置
MultipleActiveResultSets=true
Asynchronous Processing=true
,试图处理SQL强制关闭连接的可能性,但这似乎没有帮助


有什么想法吗?

您不应该缓存和重复使用DB连接对象。。。特别是从多个线程

每次需要访问数据库时,您都应该打开连接,执行操作并关闭连接


底层数据库访问基础结构(ASP.NET/OLEDB)将以这样一种方式管理连接池,从而将大多数重新连接成本(有效地)降至零。

为什么不打开连接,进行调用,然后关闭连接,并让底层ADO.NET处理连接池?您没有发布任何实际调用的代码-我认为一个简单的上下文使用块可以处理结束部分。我和EF玩得不多,所以我可能会离开这里。让我猜猜,这是网络应用…@Tim我不知道。我不这么认为。Jon Skeet的回答似乎暗示DataClasses对象应该足够聪明来处理它。@leppie不,这是一个WPF应用程序。@Doc:是的
ThreadStatic
将解决这种情况下的问题。使用
ThreadStatic
时,请记住
\u instance
最初在每个线程上都将为null(除非通过静态构造函数在某个点赋值,但这种情况只发生一次,而不是每个线程)。IIRC,
DataContext
在LINQ2SQL中按需打开/关闭连接(如果尚未打开)。谢谢。您知道有任何提供这些说明的文档吗?对于迟来的回复,我深表歉意。应该可以很好地概述最大化连接池好处的最佳方法