从大型数据库查询创建 Excel 文件时 IIS 挂起

问题描述

我有来自 ASP 和 IIS 的遗留代码,使用 OLE.DB 连接作为站点配置,并且每当下载数据文件的大型查询请求(作为 html 但在 Excel 扩展中)时,IIS 在完成或终止之前不会响应所有其他请求。被检查以增加虚拟内存或应用程序池大小,但无济于事。只是怀疑这可能是大型 blob 处理的 IIS 限制,但还不知道如何解决或绕过这个问题。请帮助了解在 IIS 中创建大数据文件时可以做什么或如何防止拒绝请求。

  • 我应该检查哪些 IIS 端应该修复的地方?
  • 代码重构以防止 IIS 挂起
  • 关于出行的任何其他建议......

不幸的是,这是遗留系统,我们的系统工程师声称没有这方面的经验。此外,ASP 似乎还没有太多资源可以从网络上解决类似问题。

下面的 ASP 代码是实际的,"sReportType=1" 工作正常,因为它只处理少量数据没有任何问题。 (虽然仍然怀疑它对操作有危害,但因为它的大小比……小)但是,当“sReportType=2”运行时,IIS只服务这个请求,不响应其他请求。

我确实理解即使有当前的 Excel 限制,它也只允许包含 15000 个低点并在手之前切断数据,但没有用。我也为大数据更改了 http 连接的 TTL,但没有奏效。修改后的 IIS 应用程序池改善了一点,但在从 DB 获取大数据时,拒绝其他连接的情况也一样。有时甚至html标签下载完成后也没有完成。

请提前感谢您的帮助。

<%@ Language=VBScript%>
<% On Error Resume next

setsize     = 10
    
Set DbCon   = Server.CreateObject("ADODB.Connection")
DbCon.Open("Provider=OLEDB...) 'DB Connection String

...

sReportType = Request("sReportType") 'receive report type
if sReportType = "" then    
    sReportType = "1"   
end if

' Getting input value from request
sHospCd         = Request("sHospCd")
sName           = Request("sName")
sCHART_NO       = Request("sCHART_NO")
sSex            = Request("sSex")
sCZP_KIND       = Request("sCZP_KIND")

sstartDate      = Request("sstartDate")
sEndDate        = Request("sEndDate")
sstOP_KIND      = Request("sstOP_KIND")

If sReportType = "1" then           
    sPA_LAB_DATE        = Request("sPA_LAB_DATE")
    ePA_LAB_DATE        = Request("ePA_LAB_DATE")
    sPA_QUERY_YN        = Request("sPA_QUERY_YN")

    sPA_UPDATE_DATE     = Request("sPA_UPDATE_DATE")
    ePA_UPDATE_DATE     = Request("ePA_UPDATE_DATE")
End If 

If sReportType = "2" then           'Baseline
    sFU_LAB_DATE        = Request("sFU_LAB_DATE")
    eFU_LAB_DATE        = Request("eFU_LAB_DATE")
    sFU_QUERY_YN        = Request("sFU_QUERY_YN")
    
    sFU_UPDATE_DATE     = Request("sFU_UPDATE_DATE")
    eFU_UPDATE_DATE     = Request("eFU_UPDATE_DATE")
End If
...
...
subsql = ""
subsql2 = ""
qTitle = " Search Item [ "

if sReportType = "1" then   
    subsql = subsql & " FROM PATIENT P WHERE 1 = 1 "

    subsql2 = subsql2 & ",P.HOSP_TRANS,P.HOSP_TRANS_NM," 
    subsql2 = subsql2 & " P.LAB_DATE,P.WBC,DECODE(P.WBC_UNIT,'1','/mm<sup>3</sup>','2','/L','') AS WBC_UNIT,P.SEG_NEUTRO,P.BANDS,P.ANC,P.INIT_DATE," 
    subsql2 = subsql2 & " GETMNM('6002',P.CZP_KIND) CZP_KIND,GETMNM('6003',P.CZP_WEEK) CZP_WEEK,P.CZP_S_DATE,P.CZP_E_DATE,P.NEXT_LAB_DATE,P.DOCTOR_NM,P.DOCTOR_EMAIL,P.PHARMA_NM," 
    subsql2 = subsql2 & " P.PHARMA_EMAIL,P.INPUT_NM,P.INPUT_EMAIL,P.CMMT_RESULT,P.QUERY_RESULT,P.CMMT_SPEC                                   " 


ElseIf sReportType = "2" then           'Large Report Creation sql String
    strTableWidth = "2800"              'Limit size of width

    subsql = subsql & " FROM PATIENT P,FU B WHERE P.PAT_ID = B.PAT_ID "
    
    subsql2 = subsql2 & ",B.FU_KIND,B.FU_NO,B.LAB_DATE,B.WBC,DECODE(B.WBC_UNIT,B.SEG_NEUTRO,B.BANDS,"
    subsql2 = subsql2 & " B.ANC,DECODE(B.STOP_KIND,'StopFollow','Terminate','') AS STOP_KIND," 
    subsql2 = subsql2 & " DECODE(B.STOP_CAUSE,'Irregular','Improve','3','Transfer','4','Others','') AS STOP_CAUSE,B.STOP_TRANS_NM,B.STOP_ETC,B.DOCTOR_NM,B.DOCTOR_EMAIL,B.PHARMA_NM," 
    subsql2 = subsql2 & " B.PHARMA_EMAIL,B.INPUT_NM,B.INPUT_EMAIL,B.CMMT_RESULT,B.QUERY_RESULT,B.CMMT_SPEC               " 


End If

sql2 = "SELECT COUNT(*) " & subsql
tn = GetRecordCount(sql2)

If sReportType = "1" then
    subsql = subsql & " ORDER BY P.HOSP_CD,P.RAND_DATE DESC,P.PAT_NM "
ElseIf sReportType = "2" then           
    subsql = subsql & " ORDER BY P.HOSP_CD,B.LAB_DATE DESC "

End If

qTitle = qTitle & " ]"

sql = "     SELECT getHospNM(P.HOSP_CD) HOSP_NM,P.PAT_ID,P.HOSP_CD,P.RAND_DATE,P.PAT_NM,P.CHART_NO,P.dob,P.AGE,P.SEX,P.FILENAME,P.PAT_WANDERING,P.PAT_WANDERING_NUM "
sql = sql &         subsql2
sql = sql &         subsql

set objRs=DbCon.Execute(sql)

Response.buffer=true
Response.ContentType = "application/vnd.ms-excel; name='My_Excel'"
If sReportType = "1" then
    response.addheader "Content-disposition","attachment;filename=small.xls"
ElseIf sReportType = "2" then       
    response.addheader "Content-disposition","attachment;filename=Large.xls"

End If

sHTTP_HOST = request.ServerVariables("HTTP_HOST")
%>

<table> <tr>... 
    ' creating html table to print and start downloading file with ".xls" extension
    ...
<%
    do while Not (objRs.BOF OR objRs.EOF)
        aaa = objRs("aaa")
        bbb = objRs("bbb")
        ccc = objRs("ccc")
    ...
    </tr>
<% 
    objRs.MoveNext
    Response.Flush
    
    Loop
    'end of table loop

    objRs.Close
    DbCon.close
    Set objRs = nothing
    Set DbCon = nothing
%>
</table>

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)