【问题标题】:How to handle multiple data connections at once如何一次处理多个数据连接
【发布时间】:2016-02-18 10:16:31
【问题描述】:

我有一个从多个数据库收集数据的 ASP.NET MVC 应用程序。

数据库保存着不同站点的信息,对于每个新站点,我们都有一个新数据库。每个站点的数据库在两个点连接,从站点连接,然后从总部连接。

Web 应用程序每分钟从站点更新数据,并且每分钟将数据提供给总部(通过另一个 Web 应用程序)。有时应用程序响应很慢,据我调查,这可能是因为连接池开始迅速填满。

我想问一下这种应用程序的最佳方法是什么,我可以从中获得最佳性能。欢迎任何指导。

【问题讨论】:

  • 如何从数据库中获取数据?使用存储过程还是 EF?并提供有关您的应用程序架构的一些详细信息。因为答案是“真的取决于”。
  • 在 MVC 应用程序中,我使用实体框架(LINQ to SQL 类)来获取数据

标签: asp.net-mvc database


【解决方案1】:

如何提高您的 Web 应用程序在数据库方面的性能,实际上取决于您的架构。但是您应该始终遵循一些一般规则:

  1. 检查线程饥饿:在 Web 服务器上,.NET Framework 维护用于服务 ASP.NET 的线程池 要求。当请求到达时,池中的一个线程 被派去处理该请求。如果请求被处理 同步地,处理请求的线程被阻塞 在处理请求时,该线程无法服务 另一个请求。

    这可能不是问题,因为线程 池可以足够大以容纳许多阻塞的线程。 但是,线程池中的线程数是有限的。在 处理多个同时长时间运行的大型应用程序 请求,所有可用线程都可能被阻塞。这个条件是 称为线程饥饿。当达到这个条件时,Web 服务器排队请求。如果请求队列已满,Web 服务器拒绝 HTTP 503 状态的请求(服务器太忙)。

    对于“线程饥饿”,最好的方法是使用“异步 方法”。有关详细信息,请参阅 here

  2. 尝试在数据上下文中使用 using 块,在完成后立即处理它们。

  3. 交易中的大量数据:您应该检查您的代码。 可能是您使用了太多数据而不需要所有这些数据。为了 例如,您转移所有可能只需要一个的对象 对象的属性。在这种情况下使用“投影”(请参阅​​here 一个例子)。

    您也可以根据自己的情况使用“延迟加载”或“急切加载” 情景。但请注意,这些都不是 每个场景。在某些情况下,“延迟加载”可以提高性能并 在其他人“急切加载”使事情变得更快。这取决于你的 深入了解这两个术语以及您的问题案例, 你的代码和你的设计。

  4. 在服务器端或客户端过滤您的数据。在服务器端过滤数据有助于尽可能减少服务器负载和网络流量。它还使您的应用程序更具响应性并具有更好的性能。使用 IQueryable 接口进行服务器端过滤(查看here 了解更多信息)。 使用服务器端过滤的一个副作用是具有更好的安全性
  5. 检查您的架构,看看是否有任何瓶颈。一种 被调用过多的控制器,一种处理大量的方法 包含大量数据的对象,数据库中接收的表 不断地请求,都是瓶颈的候选者。

  6. 在适用于大多数请求的数据时使用兑现数据。但又一次 根据您的情况明智地使用现金。错误的兑现使 你的服务器很慢。

如果您认为您的速度问题完全出在您的数据库上,最好的方法是使用 sql 分析工具来找出您遇到危急情况的点。也许重新设计您自己的表格可能是一个答案。尽量将读写表分开。可以通过创建适当的视图来完成分离。还要检查this 清单以监控您的数据库。

【讨论】:

  • 您好 Hadee 感谢您的详细回答。我面临的问题是应用程序基本上正在转变为流数据应用程序。我们有多个端点在 1 分钟内更新服务器。数据以 40 KB/s 的速度传入,这意味着数据库服务器始终在进行事务处理(插入、更新或删除)。每一秒我们都有新数据,所以我不知道它是否排除了缓存。在这种情况下你会提出什么建议
  • 速度问题到底在哪里?
  • 数据库查询,当负载较轻时,一切正常,但是当大约 20 个站点同时上传时,我们会有点慢,可能是 10 到 20 秒。这可能不多,但确实如此,因为每一秒的数据都非常重要。原因是连接池几乎被填满了,(或者这就是我们的想法)
猜你喜欢
  • 1970-01-01
  • 2016-06-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多