1

我的老板在 10 年前写了这个非常复杂的软件,并要求我将它迁移到我刚刚在 VPS 上设置的新 IIS 7 服务器上。我设法让一切顺利进行,除了一个超时并将 CPU 发送到 100% 的小循环。

这是罪魁祸首:

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
     do while not rs_ss.eof

        'conta gli elementi della sottosezione
        rse.filter ="categoria='" & rs_ss("categoria") & "'"
        if not rse.eof then
            n=0
            do while not rse.eof        
                rse.movenext
                n=n+1
            loop
            rse.movefirst   
            r=1
            do while not rse.eof
                dettagliarisorse rse, "s_ss",r ,n
                r=r+1
                rse.movenext
            loop
        end if
        rse.filter =""
        rs_ss.movenext
     loop
end if
rs_ss.close

如果我只是像这样删除或注释掉中心部分:

rs_ss.open  "SELECT DISTINCT idMC, idUtente, Categoria FROM forte01.RisorseS WHERE idmc=" & request.querystring("idmc") & " and idutente=" & session("idutente") &  " order by  categoria" ,conn 

if not rs_ss.eof then
 do while not rs_ss.eof
   rs_ss.movenext
 loop
end if
rs_ss.close

它一直在做。

在旧域上它可以正常工作。任何想法为什么?

4

2 回答 2

0

这取决于代码顶部的查询中返回的数据。如果它返回很多行,那么这将采用一条非常缓慢的路线来计算行数。重写查询以计算类别的出现次数,这样您就不会在代码中执行此操作,因此您可以在 n=n+1 附近放弃该循环。

此外,顶部的查询有一个很大的禁忌!您将原始查询字符串值直接传递到内联 SQL 查询中。这是一个容易受到 SQL 注入攻击的代码示例。通过查询字符串“idmc”传递的值可以很容易地用作 SQL 注入攻击的入口点。如果这是一个整数,至少将其包装在一个不允许将自由格式文本传递给内联 SQL 的函数中。IE

CInt(Trim(request.querystring("idmc")))
于 2013-10-24T21:39:30.747 回答
0

问题出在 Sql Server 用户权限上。用户无权访问该特定架构。

于 2013-10-27T10:14:53.803 回答