超时已过期。从池中获取连接之前经过的超时时间。这可能是因为所有池连接都在使用中并且达到了最大池大小。
这是我很久以前开发的第一个ASP.net网站,它的代码位于很多页面的顶部(并且有很多方法)。
cn = new SqlConnection(ConfigurationManager.ConnectionStrings["LocalSqlServer"].ToString());
cn.Open();
很多网页都没有:
cn.Close();
此外,没有一个页面using(SqlConnection...)
,(尽管所有数据读取器都在使用块)。
第一个问题是,错误的主要候选人是什么?
第二个问题是,解决此重构/手动搜索未闭合连接的最佳方法是什么?我知道这是一个丑陋的黑客,但重构的时间将是巨大的,但我们可以设置一个计划的任务,每天凌晨3点回收连接池一次吗?
答案 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属性。