我的老板在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
它一直在做。
在旧域上它没有问题。有什么想法吗?
答案 0 :(得分:0)
这取决于代码顶部的查询中返回的数据。如果它返回了很多行,那么这将采用非常慢的路径来计算行数。重写查询以计算categoria的出现次数,这样您就不会在代码中执行此操作,因此可以将该循环放在n = n + 1周围。
此外,顶部的查询有一个很大的禁忌!您将原始查询字符串值直接传递到内联SQL查询。这是易受SQL注入攻击的代码示例。通过查询字符串“idmc”传递的值可以很容易地用作SQL注入攻击中的入口点。如果这是一个整数数字,至少将它包装在一个函数中,该函数不允许将自由格式文本传递给内联SQL。即。
CInt(Trim(request.querystring("idmc")))
答案 1 :(得分:0)
问题在于Sql Server用户权限。用户无权访问该特定架构。