0

我有一个用于进行数据库调用的 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);

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

ExecuteNonQuery 需要一个开放且可用的连接。连接的当前状态为关闭。

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

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

有任何想法吗?

4

1 回答 1

1

不应该缓存和重用数据库连接对象......尤其是来自多个线程。

应该在每次需要访问数据库时打开连接、执行操作并关闭连接。

底层数据库访问基础结构 (ASP.NET/OLEDB) 将以将大多数重新连接成本降低到(有效)零的方式管理连接池。

于 2013-03-27T18:41:44.037 回答