如何关闭一个Linq-to-SQL数据类连接?

本文关键字:数据 Linq-to-SQL 连接 一个 何关闭 | 更新日期: 2023-09-27 18:06:04

我有一个Linq-to-SQL datacclasses对象,我利用它进行数据库调用。我把它包装成这样:

  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);

在极少数情况下,我的dataclass对象会抛出异常:

ExecuteNonQuery需要一个打开的可用连接。的连接的当前状态是关闭的。

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

我试过把MultipleActiveResultSets=trueAsynchronous Processing=True在连接字符串上试图处理SQL强行关闭连接的可能性,但这似乎没有帮助。

任何想法?

如何关闭一个Linq-to-SQL数据类连接?

不应该缓存和重用DB连接对象…特别是在多线程中。

应该打开一个连接,执行您的操作,并在每次需要访问DB时关闭连接。

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