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