【发布时间】:2014-02-13 19:20:50
【问题描述】:
我们已经看到这个问题有一段时间了,我真的很想弄清楚是什么原因造成的。
每天有几次我们会看到网页开始抛出“[Microsoft][ODBC SQL Server Driver]Timeout expired”然后不久页面开始抛出“[Microsoft][ODBC SQL Server Driver][DBNETLIB ]SQL Server 不存在或访问被拒绝。"
我们有许多不同的应用程序连接到这个数据库服务器。它平均每秒处理大约 2500 个并发连接,平均 10,000 个事务。我们的大多数应用程序都没有任何问题,这些问题似乎只发生在 Web 服务器上。 (可能和连接池有关?)
我不确定将此问题归咎于什么。有问题的 SQL 服务器因其所做的工作而被大大压倒,并配备了每处理器许可。所以我不认为我们正在考虑许可/性能问题。
我认为可能存在 IP 连接问题,因此我将 ConnectionString 更改为使用 IP 地址并运行了一些长时间运行的 ping。我在 Web 服务器和数据库服务器之间丢失了 0 个数据包。
ASP 连接字符串现在如下所示:
Provider=MSDASQL; Driver={SQL Server}; Server=10.0.100.100; Database=DBName; UID=WebUserName; PWD=WebUserPassword; ConnectionTimeout=15; CommandTimeout=120;
用户是使用 Sql Server 身份验证连接的非域用户。所以我不认为这是一个与域相关的问题。我检查了 SQL 服务器日志文件,没有发现任何与事件对应的内容。
我发现 another stackoverflow question 描述了类似的行为,但没有解决方案。
详情:
- Web 服务器:Windows 2003 Standard SP2、IIS 6。
- 数据库服务器:Microsoft SQL Server 9.0.4035
有没有人看到/解决过这种类型的问题?有人对我下一步应该去哪里有任何建议吗?
谢谢!
-佐拉克
编辑
谁能告诉我在经典的高负载 asp 中执行 sql 查询的最佳实践是什么?我们想尝试利用连接池吗?
查看代码,很多都是这样的:
Set objCn = Server.CreateObject("ADODB.Connection")
objCn.Open(Application("RoConnStr"))
'do some stuff
objCn.Close
Set objCn = Nothing
解决方案(根据 ScottE 的建议)
This article 描述了我的问题。我进行了注册表更改,然后重新启动了服务器。
问题解决了!
【问题讨论】:
-
谢谢,我也遇到了这个问题。看起来连接池是一个红鲱鱼。当我在有和没有连接池的情况下进行测试时,服务器仍然在 TIME_WAIT 状态下创建了数千个 TCP 连接。连接池似乎允许您重用连接对象,但这些有时会在服务器之间创建许多新的 TCP 连接。
标签: sql-server asp-classic timeout connection-pooling