过程执行完成后,网页挂起

时间:2011-12-31 04:30:26

标签: c# oracle

我有一个接受excel文件的网页,从中读取数据并将其存储在缓冲区表中。然后调用一个从该缓冲区表中读取的过程,每个记录都经过多次验证。程序完成后,我从后面的代码中删除缓冲区表内容。我已使用大约100条记录执行此代码,并在几秒钟内执行。但是,当记录大小增加(比如大约2000)时,该过程需要5分钟才能执行,但网页会挂起。我检查了表,记录插入和缓冲表删除大约需要6-7分钟,但是网页即使在30分钟后也不会返回结果。我试图优化该过程,但仍然在大量记录的情况下网页挂起。

请告诉我如何避免此页面挂起的情况。任何帮助都会很棒。提前致谢

1 个答案:

答案 0 :(得分:2)

我认为您应该做的第一件事就是将您的插入包装到一个事务中。

如果单个事务的记录太多,则可以每n个记录(比如500个)执行提交。

对于返回的网页,您可能会达到IIS或客户端放弃请求的某种超时,或者如果您使用数据更新页面,则可能会出现导致页面错误的无效数据。

为此,您应该检查Windows事件日志以查看IIS或ASP.Net是否报告任何异常。您还可以运行fiddler以查看请求发生了什么。

最后,我强烈建议重新设计,不要求用户在屏幕上等待提交的表单,直到处理完成为止。

我们用于此类功能的标准模式是使用GUID在数据库中记录传入请求,启动后台工作程序以执行任务,并将GUID返回给客户端。

当后台工作程序完成(或遇到错误)时,它会使用新状态(即成功或失败)更新数据库中的请求表,如果有,则更新错误消息。

客户端可以使用GUID定期向Web服务器发出ajax请求(使用window.timeout以便不阻止用户并允许显示动画)以确定进程是否完整。完成该过程后,可以根据需要更新UI。

<强>更新

要使用GUID记录数据库中的传入请求,请创建一个包含GUID列作为主键的表,一个状态列(3个值:正在进行,成功,失败)和错误消息列。

收到请求后,在代码中创建一个新的GUID,然后在启动后台工作程序之前使用此GUID和正在进行的状态将记录写入此新表。

您将GUID传递给后台工作程序,以便它可以在完成时更新表(它只是更新该状态以完成或错误并记录错误消息,如果有的话)。

您还将通过javascript将GUID传递回客户端,以便客户端可以定期要求Web服务器使用GUID对表执行查询,以确定请求何时不再进行。