asp.net网站在进行大量查询时停止响应

时间:2011-09-27 12:46:35

标签: c# asp.net sql-server-2005 iis-6 windows-server-2003

我有一个即将发布的asp.net网站。该网站涉及业务管理。我正在准备发布的一件事是将购买的企业列表中的一大堆数据上传到我们的SQL数据库中。为此,我使用了一个非常简单的方法:将.csv文件放在服务器上的文件夹中,并使用临时页面上的Page_Load事件来处理数据并将其放入数据库中所需的逻辑

这是一个漫长的过程。业务列表被分解为一大堆文件,我在页面上设置了我的脚本,以便在每次刷新页面时从一个文件中导入所有数据。每个文件大约需要10分钟。

奇怪的是:当处理这些数据时(当服务器处理所有内容时,在page_load方法终止之前),网站被阻止 - 没有其他用户可以访问它,并且网站上的其他页面都不会加载。他们陷入了“连接......”阶段。

现在这不是一个大问题,因为该网站只是在测试环境中运行。但是,当网站处于活动状态时,我可能需要使用类似的脚本将数据放入数据库中,显然,在发生这种情况时,访问所有被阻止的用户是不可接受的。

我很确定这不是SQL Server的问题,因为我可以在此进程运行时同时进行查询,因此Web服务器一定有问题。

我无法发布代码exerpt,因为它冗长且技术性强。但是,没有什么困难:该方法从.csv文件读取数据,处理它,并为文件的每一行向外部服务发出HTTP请求,以收集一些更相关的数据。然后,所有数据都插入到SQL数据库中。

据我了解,网络服务器不应该像这样阻止。即使一个线程/用户需要大量资源,他们也应该能够同时向大量用户同时提供页面。

可以建议可能会出现什么情况吗?我应该从哪里开始寻找解决方案?

3 个答案:

答案 0 :(得分:2)

请求由异步处理程序处理。

http://msdn.microsoft.com/en-us/library/ms227433%28v=vs.85%29.aspx

这将允许您的网站在漫长的流程运行时继续开展业务。

答案 1 :(得分:2)

ASP.NET不适用于繁重的处理。 ASP.NET页面应该只触发操作。后台进程应该是繁重的工作。两者都可以使用队列或类似的东西进行通信。 网页应该只是报告后台任务的状态。

这种范式是现代计算(尤其是云计算)的核心。

答案 2 :(得分:1)

请参阅msdn的http://msdn.microsoft.com/en-us/library/ff647787.aspx#scalenetchapt06_topic8

我认为问题是你使用的是asp.net的默认设置,你没有获得足够的线程和只有2个出站tcp / ip连接。这对于一个真实的网站来说真是太可怕了。

请更改machine.config中的maxconnections,maxworkerthreads和其他内容。其中一些设置有一个公式,如12 * CPU数等。

这应该可以为您提供所需的性能提升。

希望这会有所帮助。

编辑: -

我的评论是在我了解machine.config中的autoconfig = true设置之前。我做了一些初步研究,发现这些设置适用于大多数应用程序。因此,这些自定义设置仅适用于可能需要仔细考虑优化的特殊方案。