C# Linq到SQL数据类的连接是如何关闭的?
我有一个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
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中按需打开/关闭连接(如果尚未打开)。谢谢。您知道有任何提供这些说明的文档吗?对于迟来的回复,我深表歉意。应该可以很好地概述最大化连接池好处的最佳方法