2

我的经典 ASP Web 应用程序中有一个 SQL 界面页面,它允许管理员用户对应用程序的数据库 (MSDE 2000) 运行查询 - 它仅包含用户提交的文本区域,应用程序返回结果记录列表,如下所示

Dim oRS
Set oRS = Server.CreateObject("ADODB.Recordset")
oRS.ActiveConnection = sConnectionString

// run the query - this is for the admin only so doesnt check for sql safe commands etc.
oRS.Open Request.Form("txtSQL")

If Not oRS.EOF Then
    // list the field names from the recordset
    For i = 0 to oRS.Fields.Count - 1
        Response.Write oRS.Fields(i).name & " "
    Next
    // show the data for each record in the recordset
    While Not oRS.EOF
        For i = 0 to oRS.Fields.Count - 1
       Response.Write oRS.Fields(i).value & " "
        Next
        Response.Write "<br />"
        oRS.Movenext()
    Wend
End If

这样做的问题是,如果您向其发送无效查询(拼写错误、无效联接等)而不是立即返回错误,它会挂起 IIS(您可以通过尝试从另一台计算机浏览应用程序来看到这一点,它失败了)几分钟,然后返回错误。我不知道为什么!任何人都可以帮忙吗?

4

1 回答 1

2

好吧,在 MS 支持部门工作时,我曾经有过类似的要求。不是说你也在做同样的事情,但是你问这样的故事,这可能会有所启发。

我接到一个来自印度的外部支持中心提升的电话,该中心提供 ASP 支持(他施加了足够的压力,将其提升为 SQL Server 3 级的游行支持服务——“最后一道防线”)。在网站上,SQL Server 会停止响应命中特定的 SQL 查询。服务器将停止做任何事情,实际上甚至 IIS 也不再正确可用。我从一个非常热心的家伙那里得到了一个完整的案例,他甚至设法证明它是 SQL Server 的问题,因为(C++ 级别)堆栈跟踪显示 OleDB 驱动程序挂在对 SQL Server 的调用中。我一生中第一次向我展示了用于证明 SQL Server 崩溃的堆栈跟踪级别。

无论如何,一些研究结果表明 - 最初编写该网站但仍然被试图修复混乱的客户解雇的程序员不应该使用 ASP,而是提供汉堡。客户有一个特定的页面进行了很多复杂的 SQL 调用 - 并且数据库根本没有索引。基本上它会在一个非常便宜的磁盘系统上“进行十几个表扫描”。在添加了一些索引之后,系统变得可用了——客户继续检查整个复杂的数据库。支持人员显然有点为没有检查 SQL Server 实际在做什么而感到羞愧(这会导致尴尬的执行计划立即停止 IO)。

故事又回到了你身边;)

您说查询错误,IIS 会停顿几分钟。

您能否验证: * 这发生在 IIS 上?做一个例子,并在 IIS 和企业管理器中检查?如果它也挂在企业管理器中 - 它不是 IIS。* 它像在应用程序中一样挂起 IIS。IIS/其他应用程序/静态页面的其余部分是否仍然有效?*代码确实发生在页面中,而不是在中心元素/事件处理程序/同步连接中,所以一个挂起的访问会挂起整个应用程序?* 在该事件期间,IIS 处理器负载和 SQL Server 负载在做什么?* SQL Server 没有碰巧在同一台计算机上?(所以它使计算机超载并因此也命中 IIS)?

如果没有 IIS 方面的一些问题,我真的无法想象这种行为。

Basicalle,给我们更多的背景,我们应该找到它;)同时,享受我的故事。

于 2010-03-26T06:43:36.253 回答