Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/274.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 超时已过期。从池中获取连接之前经过的超时时间。_C#_Entity Framework - Fatal编程技术网

C# 超时已过期。从池中获取连接之前经过的超时时间。

C# 超时已过期。从池中获取连接之前经过的超时时间。,c#,entity-framework,C#,Entity Framework,我正在使用WebApi和AngularJS开发一个应用程序。我花了一些时间来申请后,得到了这个例外。我正在该应用程序中使用EntityFramework “超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中,并且已达到最大池大小。” 堆栈跟踪 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSourc

我正在使用WebApiAngularJS开发一个应用程序。我花了一些时间来申请后,得到了这个例外。我正在该应用程序中使用EntityFramework

“超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中,并且已达到最大池大小。”

堆栈跟踪

at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
↵ at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at System.Data.EntityClient.EntityConnection.OpenStoreConnectionIf(Boolean openCondition, DbConnection storeConnectionToOpen, DbConnection originalConnection, String exceptionCode, String attemptedOperation, Boolean& closeStoreConnectionOnFailure)

关闭数据库连接(这非常重要)

检查有多少用户连接到您的数据库以及查询超时。如果执行查询的时间过长,也要进行检查

也许,重复的问题是:


请尝试以下方法

  • 始终关闭最后一个块中的连接

  • 增加连接字符串中的池大小 string connectionString=“数据源=本地主机;初始目录=北风;”+ “集成安全性=SSPI;最小池大小=10;最大池大小=100”

  • 根本不要使用池 string connectionString=“数据源=本地主机;初始目录=北风;”+ “集成安全性=SSPI;池=false;”


  • 我也经历过同样的问题。我最终使用了这样一种模式,似乎解决了这个问题:

    using (SqlConnection con = new SqlConnection(strCon)) 
    {
        using (SqlCommand cmd = new SqlCommand(strCmdText, con)) 
        {
            con.Open();
            using (SqlDataReader dr = cmd.ExecuteReader())
             {
                  //do stuff;
                  dr.Close();
             }
         }
         con.Close();
    }
    
    这似乎解决了我的问题
    DataReader.Close()
    是钉子做的。似乎微软应该改变他们的建议,因为我在他们的网站上到处都找到了建议不要使用
    try{}finally{con.Close();}
    模式。我并没有明确地尝试这一点,因为这种模式在整个db层中相当普遍,并且希望找到更接近的东西


    我希望这对某人有所帮助。

    强制垃圾收集器调用:

    System.GC.Collect()
    

    有点老了,很抱歉把这件事扯了出来,但这周我们在工作中遇到了这样的事情:

    @sohail naseer回答说,您的连接未关闭,或者您的数据类使用不正确:


    如果您循环105次,并且在每个循环中声明一个新的数据对象并用它查询数据库,那么即使您正确地关闭和处理对象,您也已经创建了105个连接(从而破坏了允许的最大100个连接),SQL仍然需要时间将该连接重新分配给新用户。

    建议在SqlConnection和SqlCommand对象周围使用using语句

    请注意,如果您有一个函数在SqlDataReader循环中使用yield return返回IEnumerable,那么这是而不是推荐的模式。这样,与数据库的连接将在执行数据读取器之前关闭


    相反,将CommandBehavior.CloseConnection参数应用于ExecuteReader调用。

    如果没有代码,很难说出什么问题。如果让我猜的话,我会说你需要使用
    using
    块。是的,我没有使用“using statement”,这对我的案例有效。但我更喜欢另一种选择:不要在连接字符串中使用连接池(…;pooling=false;…)。所以,我可以把垃圾收集留在系统级本身。拜托,拜托,拜托!除非完全确定这是一个好主意,否则不要强制执行GC(很可能不是)。有关更多信息,请参阅。他没有打开或创建连接;实体框架是在幕后暗中进行的。如果能调用
    newsqlconnection
    ,那就太好了,因为这样他就可以
    使用
    来处置它了。
    
                                  or 
    
    using (SqlConnection con = new SqlConnection(strCon)) 
    {
        using (SqlCommand cmd = new SqlCommand(strCmdText, con)) 
        {
            con.Open();
            using (SqlDataReader dr = cmd.ExecuteReader())
             {
                  //do stuff;
                  dr.Close();
             }
         }
         con.Close();
    }
    
    System.GC.Collect()