如果我们有数据库调用,异步处理实际上有帮助吗?

时间:2012-01-20 22:31:29

标签: c# asynchronous

在服务器中,如果我有一个异步函数,它将处理一些数据库调用并从表中获取一些记录。如果服务器收到大量请求,那么该数据库调用可能实际上是阻塞的,我们实际上并没有异步工作。

  1. 当我们在服务器进程中有一些数据库调用时,异步方法有帮助吗?

  2. 如果没有,由于这些方法会出现什么问题?

  3. 我不想将其自定义到特定数据库,因为那时我的问题会有所不同。我只想在这里围绕异步编程范例展开。如果有一些关于数据库获取操作的优化方法的建议,那么欢迎。我想知道开始的正常提取。

4 个答案:

答案 0 :(得分:1)

在加载下的并发应用程序中,异步方法调用可以提高性能和吞吐量,因为调用线程可以自由地执行其他工作。

有些情况下它无济于事,但如果您的应用程序花费大量时间做其他事情而不是等待数据库中的数据,您应该会看到一些好处。这些好处适用于服务器端和GUI应用程序。

例如,如果您的应用程序花费300毫秒等待数据,300毫秒处理它,并且您正在处理大量并发请求,则可能会通过使用异步调用将吞吐量增加一倍,因为每个请求数据的线程都将被释放立即启动,然后可以处理先前请求返回的数据。

在实践中,您很少会看到这种程度的改进,因为请求的间隔时间不均匀,并且通常不需要相同的工作量。但差异应该是显而易见的。

但是,如果您花费300毫秒等待数据,并且只花费10毫秒处理数据,那么您将看不到任何接近数据的改进。

在ASP.Net等环境中,这非常重要,因为可用于处理所有传入Web请求的线程数量有限:如果所有线程都在数据库服务器上等待,则不会提供任何页面。 / p>

在Windows窗体应用程序中,使用异步调用来获取数据允许UI在获取数据时保持响应,允许用户在无聊等待时为用户提供取消选项。

明显的缺点是它使调用代码变得更加复杂。

答案 1 :(得分:0)

这里有两个潜在的问题,第一个可以通过使用异步方法解决,第二个只能通过调整数据库来解决。

使用异步方法将允许您的客户在等待您的服务器时执行其他处理,即在UI的情况下保持响应。

数据库锁定问题只能通过分析加载下的数据库来解决,以查看哪些表被锁定以及哪些存储过程或进程导致锁定。

如果确实需要大量请求,您可能需要查看内存缓存或其他优化。

答案 2 :(得分:0)

如果您还有其他工作需要调用线程执行,那么使用异步调用将在您描述的情况下有助于提高吞吐量。例如,如果线程1处理对服务器的请求&进行数据库调用,即使您使用.BeginInvoke(res),然后立即使用.EndInvoke(res),您仍然会阻止该调用。

要正确扩展,您需要确保线程1还有其他工作要做,也许准备另一个页面请求,直到数据库调用完成。这可以通过使用共享工作队列或顺序队列(如管道模式)来完成。查看此问题中的一些链接,了解有关异步设计模式的更多详细信息,以及它们如何帮助您从服务器中获得更好的吞吐量。

设计模式[1]:Resources about Asynchronous Programming Design Patterns

答案 3 :(得分:0)

保持答案简短:

在进行数据库调用时,使用异步处理可以帮助特别

在服务器应用程序中,您应该避免阻塞线程。如果在典型请求中您的服务器访问数据库,那么如果您同步执行此操作,则意味着您的线程在大多数情况下都会被阻塞等待IO。当足够的线程被阻塞时,这将在您的服务器上引入瓶颈并损害可伸缩性,因为没有线程池线程可用于处理新请求,此外您的CPU可能未得到充分利用,因为没有线程可用于拾取工作要做。