2013-03-27 65 views
0

我有一个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=trueAsynchronous Processing=True放在连接字符串上,试图处理SQL强行关闭连接的可能性,但这似乎没有帮助。

任何想法?

+1

为什么不打开连接,进行调用,然后关闭连接并让底层的ADO.NET处理连接池?你没有发布任何你的代码用于实际的调用 - 我认为一个简单的使用块与上下文将照顾关闭部分。我并没有在EF上打太多的比赛,所以我可能会离开这里。 – Tim 2013-03-27 18:19:21

+0

让我猜,这是网络应用程序... – leppie 2013-03-27 18:48:08

+0

@Tim我不知道。我不这么认为。乔恩Skeet的答案[这里](http://stackoverflow.com/a/400888/84873)似乎意味着DataClasses对象应该足够聪明来处理它。 – Daniel 2013-03-27 18:48:20

回答

1

不应该缓存并重新使用DB连接对象...尤其是来自多个线程。

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

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

+0

谢谢。您是否知道提供这些说明的任何文档? – Daniel 2013-03-27 18:51:21

+0

对迟交的道歉。 [MSDN文档](http://msdn.microsoft.com/en-us/library/8xx3tyca(v = vs.110))。aspx)应该给你一个关于最大化连接池优点的最佳方法的很好的概述 – 2013-12-06 06:19:42