【问题标题】:Classic ASP application experiencing SQL Server "Timeouts" and "SQL Server does not exist or access denied"经典 ASP 应用程序遇到 SQL Server“超时”和“SQL Server 不存在或访问被拒绝”
【发布时间】: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


【解决方案1】:

您的网络应用程序是否正在关闭并处理(设置为空)数据库连接?

另外,您是否尝试过使用 SQLOLEDB 代替 ODBC?想不出为什么要在这里使用 ODBC。

这是我在一个非常繁忙的经典 asp 应用程序上的连接字符串:

Dim strcConn
strConn = "Provider=SQLOLEDB; Data Source=someserver; Initial Catalog=somedb; User ID=someuserid; Password=somepassword"

编辑

我看到了这篇博文。有点意思。

http://www.ryanbutcher.com/2006/02/classic-asp-on-2003-server-with.html

【讨论】:

  • 以下是我要看的两件事:ODBC 为连接添加了不必要的抽象,而无法回收连接是一个常见问题。
  • 大多数情况下,应用程序在完成时不会将连接对象设置为空。我当时的理解是,留下连接对象是可以的,因为当页面完成渲染时它会超出范围。那时连接池不会接管吗?
  • @zorlack - 设置连接对象 = 经典 asp 的内存管理最佳实践。
【解决方案2】:

我通过重新创建存储过程解决了这个问题!
只是一个简单的DROP 然后CREATE 在我的情况下停止了超时!

我被这个问题困扰了一周;当我可以在不到一秒的时间内直接在数据库上运行相同的查询时,经典的 ASP 会说“SQL 超时”。 (虽然我没有看到“不存在”的消息。)ASP 已经工作了整整一个月。

我的一个天才朋友说,“通过 ASP 使用'缓存'执行计划,效率不高。尝试删除并重新创建。这确实表明您的存储过程可以通过重写来提高效率,因为它可能会再次发生。”

由于在使用 SQL Management Studio 测试时 proc 运行良好,我假设它没有使用缓存计划,但 ASP 使用了。

【讨论】:

  • 这是一个非常非常非常好的答案,需要点赞!多年来一直与 ASP 合作,从未遇到过这个问题(谢天谢地,因为我的程序没有引起任何问题),但这是非常好的信息,请牢记!谢谢!
  • 如果缓存计划是问题所在,您可以通过命令 SQL 显式重新评估缓存计划来解决此问题,从而减少中断:“exec sp_recompile 'MyProcedure'” 这样可以避免意外更改权限的问题。
【解决方案3】:

当我遇到这样的问题时,总是不得不与某人在客户端应用程序中打开数据而不提交“select ..”语句。

不知道这是否能解决你的问题……不过。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多