我有一个Linq-to-SQL DataClasses对象,我用它来进行数据库调用。我把它包像这样: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);
在极少数情况下,我的数据类对象将抛出例外:
ExecuteNonQuery需要一个开放且可用的Connection。连接的当前状态将关闭。
我没有以任何方式管理连接的状态 - 我认为Linq-to-SQL应该处理这个问题。每次拨打电话时我都可以检查Connection的连接状态,如果它已关闭但是看起来像是黑客,则可以打开它。
我试过把MultipleActiveResultSets=true
和Asynchronous Processing=True
放在连接字符串上,试图处理SQL强行关闭连接的可能性,但这似乎没有帮助。
任何想法?
为什么不打开连接,进行调用,然后关闭连接并让底层的ADO.NET处理连接池?你没有发布任何你的代码用于实际的调用 - 我认为一个简单的使用块与上下文将照顾关闭部分。我并没有在EF上打太多的比赛,所以我可能会离开这里。 – Tim 2013-03-27 18:19:21
让我猜,这是网络应用程序... – leppie 2013-03-27 18:48:08
@Tim我不知道。我不这么认为。乔恩Skeet的答案[这里](http://stackoverflow.com/a/400888/84873)似乎意味着DataClasses对象应该足够聪明来处理它。 – Daniel 2013-03-27 18:48:20