由于连接未关闭,ASP.net超时

时间:2011-06-15 11:53:07

标签: c# asp.net iis-7 database-connection connection-pooling

  

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

这是我很久以前开发的第一个ASP.net网站,它的代码位于很多页面的顶部(并且有很多方法)。

cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
cn.Open();

很多网页都没有:

cn.Close();

此外,没有一个页面using(SqlConnection...),(尽管所有数据读取器都在使用块)。

第一个问题是,错误的主要候选人是什么?

第二个问题是,解决此重构/手动搜索未闭合连接的最佳方法是什么?我知道这是一个丑陋的黑客,但重构的时间将是巨大的,但我们可以设置一个计划的任务,每天凌晨3点回收连接池一次吗?

2 个答案:

答案 0 :(得分:1)

是的,这是错误的主要原因。目前,许多连接将等到下一个GC重新汇集底层连接。您将很快耗尽池(和数据库连接)。

重构这个的最好方法是添加缺少的using,以便连接成为范围。就个人而言,我也会将其重构为一种方法,即

using(var cn = SomeUtilityClass.GetOpenConnection())
{...}

除非读者被标记为close the connection,否则关闭读者几乎没有;并且让数据读取器关闭连接(通过行为)排序有效,但它假设您已经消费了读者 - 它在错误情况下不一定表现良好。

答案 1 :(得分:1)

即使我在曾经处理过的应用程序中遇到过这个错误。我发现的问题是相同的 - 没有使用语句,也没有关闭调用。

我建议您在整个项目中搜索SqlConnection,然后在using语句中包含SqlConnection,SqlCommand和SqlDataAdapter,并在sqlconnection using语句中执行connection.close。在配置文件中与此一起增加连接字符串内连接的超时。您还可以使用SqlCommand的CommandTimeout属性。