c# – 执行长时间运行的数据库任务时处理Web服务超时

我们的产品之一的架构是典型的3层解决方案:

> C#客户端
> WCF Web服务
> SQL Server数据库

客户端从Web服务器请求信息. Web服务点击数据库获取信息并将其返回给客户端.

这是问题.其中一些查询可能需要很长时间,我们不知道哪些查询会慢一些.我们知道一些通常比其他人慢,但是即使是最简单的请求,给定足够的数据也是缓慢的.有时使用查询或运行大量数据的报告.这些查询只有在数据量减慢之前才可以进行优化.

如果数据库中的查询在SQL服务器中遇到最大查询超时,则数据库查询将终止,并且Web服务会向客户端返回错误.这是明白的.我们可以处理这些错误.

客户端正在等待Web服务调用完成.如果数据库调用需要很长时间,客户端可能会在其对Web服务的调用时超时.客户端放弃,但数据库请求继续处理.此时,客户端与数据库不同步.数据库调用可能或可能不会成功.可能有错误.客户永远不会知道.在某些情况下,我们不希望我们的用户发起另一个可能导致上一个请求完成的无效状态的请求.

我很好奇,看看别人怎么处理这个问题.您使用什么策略来防止Web服务超时影响数据库调用?

我可以想出的最好的想法涉及到一个实际的数据库层,在Web服务内部,附加到消息队列中.将每个查询卸载到另一个进程似乎过多. (再次,我们并不总是知道给定的请求是快还是慢)

如果我们可以将启动和运行数据库进程的动作作为HTTP请求的行为分开,那将是巨大的.我曾经在以前的公司看过这样的一个定制服务器,但是它使用直插式通信,而且我宁可避免使用一些自定义应用程序替换Web服务.

请注意,鉴于我们处理的数据量,我们都是查询优化.查询优化,索引等只有在数据量较大时才能达到目标.有时候事情只需要很长时间.

最佳答案
Web服务可以在线程池中运行查询,如果线程未完成(例如5秒钟内)(请参阅Thread.Join())),则Web服务调用返回客户端JobID,而不是客户端可以的结果集用于轮询服务器每隔几秒看看它的查询是否完成.当线程完成后,结果可以存储在哈希表中,直到客户端再次轮询.

转载注明原文:c# – 执行长时间运行的数据库任务时处理Web服务超时 - 代码日志