如何关闭一个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=true
和Asynchronous Processing=True
在连接字符串上试图处理SQL强行关闭连接的可能性,但这似乎没有帮助。
任何想法?
您不应该缓存和重用DB连接对象…特别是在多线程中。
您应该打开一个连接,执行您的操作,并在每次需要访问DB时关闭连接。
底层数据库访问基础设施(ASP.NET/OLEDB)将以这样一种方式管理连接池,从而将大多数重新连接成本(有效地)降低到零。