我有一个MVC网站,用户可以从中搜索SQL Server和Oracle数据库中的大型记录集。其中一些记录集可能非常大,有数千条记录。可悲的是,用户要求他们不要使搜索更具体。
当用户将他们的搜索请求发布到数据库时,我的网页会在经常超时之前挂起(由于查询数据库所花费的时间)。
我们正在考虑从MVC站点中删除昂贵的数据库调用,并将查询发送到单独的进程以在后台运行。查询完成后,我们可以通知用户。
我建议的解决方案是:
1)当用户在网页中填写搜索表单时,只需显示正在生成结果的消息,并在完成时发送 2)将SQL查询发送到数据库,该数据库可以包含需要处理的SQL查询列表 3)创建一个Windows服务,每隔几分钟检查一次该数据库以获取新查询 4)然后,此Windows服务查询数据库。查询完成后,它将创建结果的CSV,并通过电子邮件发送给用户
我正在寻找有关上述方法的一些建议和意见?人们认为这是一种在后台处理昂贵的数据库调用的方法吗?
一般来说,请求不经常发生,但如上所述,将会提供大量数据。有可能同时提出两个或更多请求,但这种情况很少发生。
我还将研究优化数据库。
感谢任何提示。
马丁:)
答案 0 :(得分:1)
另一种选择是补充现有代码以在单独的线程上执行查询,以便在等待查询结果时可以将定期保持活动更新发送到请求页面。类似于保险报价agregator页面的工作方式。 第二种选择是在结果准备好时将结果作为超链接提供,然后通过网站或通过电子邮件与用户进行通信。 选项三如果这些查询不是完全临时类型的查询,那么您可以分析最常见的组合并预先计算它们将结果定期放入新表(优化当前数据库结构的一半)。 需要注意的是,数据不会是最新的 - 但考虑到查询目前所处的时间,它可能并不重要,直到第二个?
无论您选择哪种解决方案,我认为这取决于用户的期望 - 他们是否知道他们想要什么,只是发送一个大问题并获得它并感到高兴?或者他们是否尝试了几个查询来找到正确的参数组合?如果后者等待电子邮件传递结果可能是他们不能接受的。但如果他们想要的是可下载的结果文档,并且他们第一次知道他们想要什么,那么它可能会。我在这里看到的唯一问题是电子邮件误入歧途或花费的时间超过用户认为应该多次重新提交请求并增加服务器工作量 - 缓存查询和结果可能是一个非常好的主意。
答案 1 :(得分:0)
我建议引入像消息代理一样的抽象层。请求将进入队列,批处理层将消耗来自队列的请求,一旦繁重的工作完成,批处理层将通过消息代理,请求 - 回复模式再次通知Web层。
此外,在数据库方面,优化查询总是好的。