由于业务层和数据库层设计不当,MVC4 中的极端性能问题

本文关键字:MVC4 问题 性能 于业务 业务 数据库 | 更新日期: 2023-09-27 18:36:33

第二次更新 24.10.2013

我已经将这个问题缩小到我的数据库层。显然,这是LINQ2SQL的性能问题。想象一下,在单个查询中加载 10 个实体,然后添加逻辑来检索这 10 个主要实体的子实体。为了进行性能调整,您希望在单个查询中执行该数据检索,但 L2S 总共在 11 个查询中执行此操作:

  • 一个查询来检索 10 个主要实体
  • 十个查询,用于检索每个主实体的 n 个子实体数量

网上的各种博客和文章证实了我的发现,尽管这些文章已经有几年的历史了,有些可以追溯到2007年。我找到的文章指出,实体框架是解决此问题的可能解决方案,因为 EF 支持 L2S 不支持的预期行为。可悲但真实,似乎我将不得不重新编程我的数据库层。

第一次更新 24.10.2013

我在 ANTS Profiler 的帮助下进一步缩小了这个问题的范围。我的业务逻辑和总体设计似乎存在问题。我发现了一种趋势,即创建对象的次数太多,而不仅仅是使用已经创建的版本。我正在进行大修并优化代码,看看这是否会提高最终用户体验的网站性能。

问题

我在呈现 MVC 视图时遇到严重的性能问题。根据浏览器控制台,仅包含两行文本的视图需要 3.75 秒,通过访问/Innhold/Mangler 在 Chrome 和 Internet Explorer 中进行测试

应用程序在以发布模式构建的生产环境中运行,并在 Web.config 中

这种严重的性能问题到底是什么原因?我在这里开始没有想法了。

代码附在下面。

我有以下视图称为"Feil":

@{
    ViewBag.Title = "Feil";
    Layout = "";
}
<h2>Feil</h2>
<pre>@ViewBag.Exception</pre>

我在控制器"Innhold"中得到了以下称为"Mangler"的操作:

public ActionResult Mangler()
{
    ViewBag.Exception = "Det er ikke konfigurert noen nettside for denne lenken.";
    ViewBag.Title = "404";
    ViewBag.WebsiteID = 0;
    return View("~/Views/Shared/Feil.cshtml");
}

我已经清除并添加了我需要的唯一视图引擎,并在 Global.asax .cs 的 Application_Start() 中指定了我需要的唯一文件扩展名:

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
    RouteConfig.RegisterRoutes(RouteTable.Routes);
    ViewEngines.Engines.Clear();
    ViewEngines.Engines.Add(new RazorViewEngine() { FileExtensions = new string[] { "cshtml" } });
}

由于业务层和数据库层设计不当,MVC4 中的极端性能问题

我终于解决了这个问题!

最后,这个性能问题归结为设计不佳的业务层和数据库层。

我使用 ANTS Profiler 缩小了有问题的方法的范围,并看到在应用程序的生命周期中只应该命中 1 次的构造函数对于每个请求被命中 36 次。我还检测到LINQ2SQL生成的许多其他需要优化的 SQL 查询,以及对数据库的不必要的调用。

我消除了许多进行数据库调用的 LINQ 查询,优化了剩余的调用,存储了要重用的对象状态,并在业务层和数据库层进行了大量常规优化。

我现在遇到正常的响应时间和低至 170 毫秒的页面加载。像我原始问题中的示例这样的简单视图也会发生这种情况的原因是因为我有一个自定义的基本控制器,它使用数据库在生成视图之前检索一些数据。

结论

需要优化的糟糕设计代码使我的 Web 应用程序运行缓慢且响应缓慢。

结果

在过去 48 小时内实施的全面优化带来了重大的性能提升,现在一切都按预期运行。任务完成!

我相信

你的问题在于编译时间。当应用程序首次启动时,它需要编译,以便在使用时可以更快地运行。

看看这个:https://stackoverflow.com/questions/13794580/mvc-asp-net-startup-time-revisited