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

Rav*_*tal 6 c# entity-framework

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

"Timeout expired. The timeout period elapsed prior to obtaining a connection from the pool. This may have occurred because all pooled connections were in use and max pool size was reached."

堆栈跟踪

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)
Run Code Online (Sandbox Code Playgroud)

小智 10

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

SqlConnection myConnection = new SqlConnection(ConnectionString);
try
{
     conn.Open();
     someCall (myConnection);
}
finally
{
     myConnection.Close();                
}
Run Code Online (Sandbox Code Playgroud)

要么

using (SqlConnection myConnection = new SqlConnection(ConnectionString))
{
     myConnection.Open();
     someCall(myConnection);
}
Run Code Online (Sandbox Code Playgroud)

检查连接到数据库的用户数以及查询的超时时间.如果您有很长时间执行查询,请检查.

也许,重复的问题:

如何解决ASP.NET和SQL Server之间的连接池问题?

  • 他并不是在建立或建立联系;而是在建立联系。实体框架在幕后隐式地执行此操作。如果**有**对“new SqlConnection”的调用,那就太好了,因为这样他就可以“使用”或“.Dispose”它。 (2认同)

小智 5

请尝试以下操作

  1. 始终在finally块中关闭连接

  2. 增加池大小,就像在连接字符串中一样

    string connectionString = "Data Source=localhost; Initial Catalog=Northwind;Integrated Security=SSPI; Min Pool Size=10; Max Pool Size=100";

或者

  1. 根本不使用池化

    string connectionString = "Data Source=localhost; Initial Catalog=Northwind;Integrated Security=SSPI; Pooling=false;";


小智 5

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

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();
}
Run Code Online (Sandbox Code Playgroud)

这似乎解决了我的问题。DataReader.Close()是钉子做到了这一点。看来微软应该改变他们的建议,因为我在他们的网站上发现了建议不要使用该try { } finally { con.Close(); }模式的建议。我没有明确地尝试这个,因为该模式在我们的整个数据库层中相当普遍,并且想要找到更接近的东西。

我希望这可以帮助别人。