C# 超时已过期。从池中获取连接之前经过的超时时间。
我正在使用WebApi和AngularJS开发一个应用程序。我花了一些时间来申请后,得到了这个例外。我正在该应用程序中使用EntityFrameworkC# 超时已过期。从池中获取连接之前经过的超时时间。,c#,entity-framework,C#,Entity Framework,我正在使用WebApi和AngularJS开发一个应用程序。我花了一些时间来申请后,得到了这个例外。我正在该应用程序中使用EntityFramework “超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中,并且已达到最大池大小。” 堆栈跟踪 at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSourc
“超时已过期。从池中获取连接之前已过超时时间。这可能是因为所有池连接都在使用中,并且已达到最大池大小。”
堆栈跟踪
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)
关闭数据库连接(这非常重要) 或 检查有多少用户连接到您的数据库以及查询超时。如果执行查询的时间过长,也要进行检查 也许,重复的问题是:
请尝试以下方法
我也经历过同样的问题。我最终使用了这样一种模式,似乎解决了这个问题:
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()