繁体   English   中英

ASP.NET SqlConnection超时问题

[英]ASP.NET SqlConnection Timeout issue

我遇到了一个令人沮丧的问题,我原本以为是连接泄漏,但事实并非如此。 秘密是这样的:此应用程序的数据访问使用的是Microsoft的企业库(v4)。 所有数据访问调用都使用诸如以下语句包装:

using (DbCommand dbCommand = db.GetStoredProcCommand("sproc"))
{
     db.AddInParameter(dbCommand, "MaxReturn", DbType.Int32, MaxReturn);
     ...more code
}

现在,该应用程序的索引对数据库进行了8次调用以加载所有内容,我可以通过刷新索引约15次来使应用程序崩溃。 看来,当数据库达到113个连接时,就是我收到此错误的时间。 这是什么使得它变得怪异:

我在高流量的站点上使用entlib运行类似的代码,从来没有遇到过这个问题。

如果我取消与数据库的所有连接并在每次刷新应用程序时恢复生产应用程序并运行,则可以运行此SQL

SELECT DB_NAME(dbid) as 'Database Name', 
COUNT(dbid) as 'Total Connections' 
FROM sys.sysprocesses WITH (nolock)
WHERE dbid > 0
GROUP BY dbid

我看到随着每个页面的刷新,连接的数量正在积极增加。 在本地框上使用相同的连接字符串运行相同的代码不会导致此问题。 此外,如果生产网站关闭,我可以通过Visual Studio启动该网站并正常运行,两者之间的唯一区别是生产网站已启用Windows身份验证,而我的本地副本未启用。 关闭Windows身份验证似乎对服务器没有影响。

我完全不知道是什么原因造成的,或者为什么没有在SQL Server中丢弃连接。 EntLib对象对任何东西都不会使用.Close()方法,因此我无法明确关闭该对象。

有什么想法吗? 谢谢!

编辑

哇,我刚刚注意到我从未真正发布过错误消息。 实际的连接错误是: 超时过期。 从池中获取连接之前已经过超时时间。 这可能是因为所有池化连接都在使用中,并且达到了最大池大小。

检查您正在执行的存储过程没有遇到行锁或表锁。 另外,如果您可以尝试在其他服务器上进行部署,并检查应用程序是否会再次爬网。

另外,请尝试增加SQL Server允许的最大连接数。

认为“超时已过期”错误是一个普遍问题,可能有很多原因。 增加超时可以解决其中一些问题,但不能解决所有问题。

您也可以参考以下链接进行故障排除和修复错误

http://techielion.blogspot.com/2007/01/error-timeout-expired-timeout-period.html

可能是服务器上的配置问题吗?

您如何与生产服务器上的数据库建立连接?
那可能是一个值得研究的领域。

虽然我不知道答案,但我可以建议由于某些原因,在生产环境中运行应用程序时,连接不会被您关闭。 (显而易见)

您可能需要检查Web服务器和sql服务器之间的网络配置。 高延迟网络可能导致连接无法及时关闭。

它还可能有助于查看以下msdn文章结尾处列出的性能计数器: http : //msdn.microsoft.com/zh-cn/library/8xx3tyca%28VS.71%29.aspx

最后,如果没有其他帮助,我将在生产中获得调试器和企业库源代码,并在企业库中调试您的代码,以查明为什么未关闭连接。

愚蠢的问题,您是否正确关闭了DataReader? 如果不是这样,可能是问题所在,而dev和prod之间的行为差​​异可能是由不同的垃圾回收模式引起的。

我会禁用连接池,并尝试抑制它(嘿)。 只需在连接字符串中添加“; Pooling = false”即可。

或者,也许您可​​以在页面上添加类似以下“清理”代码的内容(当页面卸载时,它将关闭打开的所有连接)-在“ using”子句中:

System.Web.UI.Page page = HttpContext.Current.Handler as System.Web.UI.Page;
if (page != null) {
           page.Unload += (EventHandler)delegate(object s, EventArgs e) {
                      try {
                                 dbCommand.Connection.Close();
                      } catch (Exception) {
                      } finally {
                                 result = null;
                      }
           };
}

另外,如果您的SQL Server和IIS在同一台计算机上,请确保已启用“共享内存”协议(这是真正的性能提升器)!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM