建立 SQL 连接需要 10 - 15 秒



我们遇到了一些奇怪的性能问题,我希望有人能够为我们指出正确的方向。 我们的方案是一个ASP.NET MVC C#网站,在IIS 7中使用EF4 POCO(高度规范的服务器,专用于此应用程序(。

显然,application_startup这是意料之中的,但它很

慢,但是一旦加载,您就可以浏览网站,一切都很好,并且快速加载了0.5ms页面(我们正在使用Mini-Profiler(。 现在,如果您停止使用该站点 5 - 10 分钟(我们将应用程序池回收设置为 2 小时,并且我们正在记录,以便我们知道它尚未被回收(,那么第一个页面加载速度慢得离谱,10 - 15 秒,但随后您可以再次导航而不会出现问题(0.5 毫秒(。

这不是SQL queries很慢,因为所有查询在第一页点击后似乎都可以正常工作,即使它们还没有运行,所以也不会在任何地方缓存。

我们已经做了大量的测试,我无法弄清楚这一点。 到目前为止,我尝试的主要方法是预生成EF视图,但这没有帮助。

似乎在 5 分钟后查看Sql Server Profiler 30 秒后,Sql Server 事件探查器中没有任何活动,也没有站点交互,应用程序会出现几个"审核注销"条目,一旦发生这种情况,似乎需要 10 - 15 秒来刷新应用程序。Sql Server是否有空闲超时?

如果在连接字符串中使用以下项,这应该有效:

server=MyServer;database=MyDatabase;Min Pool Size=1;Max Pool Size=100

它将强制您的连接池始终保持至少一个连接。我必须说我不推荐这个(持久连接(,但它会解决你的问题。

你使用的是 LMHOSTS 文件吗? 我们遇到了同样的问题。 默认情况下,LMHOSTS 文件缓存会在 10 分钟后过期。 系统闲置 10 分钟后,主机将使用广播消息,然后再重新加载导致延迟的 LMHOSTS 文件。

似乎在 5 分钟后查看 Sql Server 概述器后给出或 只需 30 秒,SQL Server 事件探查器中没有活动,也没有站点 交互 出现几个"审核注销"条目 应用程序,一旦发生这种情况,它似乎需要 10 - 15 秒以刷新应用程序。Sql 上是否有空闲超时 服务器?

这告诉我,问题很可能出在您的SQL服务器和/或与它的连接上,而不是您的应用程序上。 SQL 服务器使用连接池,SQL 会每隔一段时间就对这些池进行清理。 您似乎遇到的延迟是当您的连接池已清理(审核注销(并且您必须建立新连接时。 我会与您的SQL数据库人员交谈/工作。

对于测试,您是否有权访问未在与生产应用相同的 SQL 服务器上运行的数据库的本地/开发副本? 如果没有,请尝试进行一次设置,看看您是否遇到相同的问题。

我会对SQL Server运行"SQL Server Profiler"并捕获新的跟踪,同时通过在空闲5-10分钟后访问站点来重现问题。之后看痕迹。具体而言,查找 ApplicationName 以"EntityFramework..."开头的条目。这将告诉您 EF 当时正在做什么。EF 之上的自定义缓存可能存在一些问题,或者某些会话状态即将过期(检查 web.config 中的会话状态超时(

由于第一次运行(每个应用?(速度很慢,因此您可能会遇到将 EDMX 或 LINQ 编译为 SQL 的情况。

可能的解决方案:

    使用预编译
  1. 视图和预编译查询(可能需要大量重构(。

    http://msdn.microsoft.com/en-us/library/bb896240.aspx
    http://blogs.msdn.com/b/dmcat/archive/2010/04/21/isolating-performance-with-precompiled-pre-generated-views-in-the-entity-framework-4.aspx
    http://msdn.microsoft.com/en-us/library/bb896297.aspx
    http://msdn.microsoft.com/en-us/magazine/ee336024.aspx

  2. 在应用程序启动时(在收到第一个请求之前(试运行所有查询。
    可以使用默认连接字符串(可以是空数据库(上的假输入(例如不存在的零键(运行查询。只要确保你没有抛出异常(使用 SingleOrDefault(( 而不是 Single(( 并在 上处理空结果和 0 长度列表结果。ToList(((。

创建一个简单的网页,通过简单的查询(如"Select getDate(("或其他一些廉价查询来访问SQL Server。 然后使用外部服务(如Pingdom或其他监视器(每30秒左右点击该页面。 这应该保持连接温暖。

尝试在 web.config 中覆盖超时,如以下示例所示:

Data Source=mydatabase;Initial Catalog=Match;Persist Security Info=True
;User ID=User;Password=password;Connection Timeout=120

如果它有效,这不是一个解决方案。只是一个变通办法。

在我们的例子中,应用程序托管在 Azure 应用服务计划中,并且遇到了类似的问题。原来是未配置虚拟网络的问题。在此处查看问题/答案 - EF Core 3.1.14 定期冷启动

最新更新