让我的控制器数据库调用异步或不调用

时间:2016-05-10 14:41:18

标签: asp.net asp.net-mvc azure asynchronous azure-sql-database

我继承了一个MVC Web应用程序,它在ADO.NET之上使用Dapper在Controller动作方法中进行数据库调用。它是非常标准的东西 - 并不是很多控制器都是async,并且所有数据库调用都通过完全同步的repository

我将此移至Azure,并且我使用SQL Azure作为数据库后端。我期待负载是相当标准的 - 比如说每分钟500到1000次点击。

所以,我想知道,我是否应该通过这些代码来使我的所有数据库调用异步,以便我可以在控制器中await。这样做可以释放我的主题以满足其他请求,但我真的想知道我是否会注意到任何改进。

我知道以前,它是been noted,如果你有一个单独的数据库服务器(就像我一样),那么你真的看不到很多改进,因为瓶颈已全部开启数据库。但是,SQL Azure是一个略有不同的野兽,Azure状态

  

良好实践要求您仅使用异步技术来访问Azure数据source

等Azure服务

那么 - 这值得努力吗?

2 个答案:

答案 0 :(得分:2)

坦率地说,这里不可能给出任何明确的答案。正如Azure所述,最佳实践是对I / O绑定操作使用异步,包括查询远程数据库等操作。如果您今天从头开始使用此应用程序,我肯定会告诉您使用异步进行数据库调用。

然而,这不是一个新的应用程序,听起来使用异步将需要相当多的手术。根据您获得的负载,您可能不会看到工作的任何收益,但您可能也会看到很大的收益。我的建议是从小做起。我会选择一些更长时间运行的查询或者依赖于数据库的操作,并从那些开始。这样你就可以引入一些异步并自己判断它是否值得进一步追求它。而且,由于这些可能是您的应用程序的瓶颈,无论如何,您可以获得异步的好处,它可能最重要。

您添加的任何新功能应该从一开始就是异步,然后,只要您有时间和倾向,就可以在转换整个应用程序时缓慢工作。

答案 1 :(得分:1)

我所学到的(并通过测试验证)是你不会在相对长的SQL调用中看到很大的改进。但是,您将看到并发短SQL和非SQL相关响应的改进。这是因为初始化线程需要很高的成本。因此,重用等待SQL的休眠线程确实可以提高性能。

使用async还可以防止您过度使用#34;线程每处理器限制"在IIS中设置。当发生这种情况时,您的请求就会排队。我们已经尝试增加默认值25.这确实提高了高负载下的性能,但我们通过将所有控制器更改为异步来看到更好的改进。

所以我想你的问题的答案是,这取决于。如果除了SQL调用之外还有大量并发请求,那么应该会看到这些并发请求的响应时间有明显改善。但是你不会在相对较长的SQL调用中看到很多改进。