最近几天,我们经常在网站上看到这样的错误信息:

“超时过期。超时时间 在获取 来自池的连接。这可能 已经发生是因为全部池化了吗 连接正在使用,马克斯泳池 规模达到了。”

我们已经有一段时间没有更改代码中的任何内容了。我修改了代码以检查未关闭的打开连接,但发现一切正常。

我怎么解决这个问题? 我需要编辑这个池吗? 如何编辑此池的最大连接数? 高流量网站的推荐值是多少?


更新:

我需要在IIS中编辑一些东西吗?

更新:

我发现活动连接的数量在15到31之间,我发现在SQL server中配置的最大允许连接数超过3200个连接,是31太多了还是我应该在ASP中编辑一些东西。网络配置?


当前回答

对于我来说,使用实体框架,我错过了可以简化using语句的智能感知建议。 我错误地简化了using语句

ie

using (var db = new MyDbContext()){}

化简为

using var db = new MyDbContext();

not

var db = new MyDbContext();

其他回答

您需要告诉数据库服务器在卸载页面时关闭连接。

protected void Page_Unload(object sender, EventArgs e) {
    if (qryCnn != null) 
        qryCnn.Close();
}

在我们的网站上,我们也不时地遇到这个问题。在我们的案例中,罪魁祸首是我们的统计数据/索引过时了。这将导致先前快速运行的查询(最终)变慢并超时。

尝试更新统计信息和/或在受查询影响的表上重建索引,看看是否有帮助。

用这个:

finally
{
    connection.Close();
    connection.Dispose();
    SqlConnection.ClearPool();
}

您已经泄漏了代码上的连接。您可以尝试使用using来证明您正在关闭它们。

using (SqlConnection sqlconnection1 = new SqlConnection(“Server=.\\SQLEXPRESS ;Integrated security=sspi;connection timeout=5”)) 
{
    sqlconnection1.Open();
    SqlCommand sqlcommand1 = sqlconnection1.CreateCommand();
    sqlcommand1.CommandText = “raiserror (‘This is a fake exception’, 17,1)”;
    sqlcommand1.ExecuteNonQuery();  //this throws a SqlException every time it is called.
    sqlconnection1.Close(); //Still never gets called.
} // Here sqlconnection1.Dispose is _guaranteed_

https://blogs.msdn.microsoft.com/angelsb/2004/08/25/connection-pooling-and-the-timeout-expired-exception-faq/

不要实例化sql连接太多次。打开一个或两个连接,并将它们用于接下来的所有sql操作。

似乎即使在处置连接时也会抛出异常。