建立SQL连接需要10-15秒

时间:2012-05-22 11:16:42

标签: sql-server asp.net-mvc performance iis-7 entity-framework-4

我们遇到了一些奇怪的性能问题,我希望有人能指出我们正确的方向。我们的方案是在ASP.NET MVC C#中使用EF4 POCO的{​​{1}}网站(高度推荐的服务器,专门用于此应用程序)。

显然,它在application_startup上很慢,但是一旦加载了,你可以浏览网站,一切都很好,并且加载了0.5ms页面(我们正在使用IIS 7)。现在,如果您停止使用该网站5至10分钟(我们将应用程序池循环设置为2小时,我们正在记录,因此我们知道它尚未被回收),那么第一页加载速度非常慢,10 - 15秒,但是你可以在没有问题的情况下再次导航(0.5ms)。

这不是Mini-Profiler,因为所有查询在第一个页面命中后似乎工作正常,即使它们尚未运行,因此也没有在任何地方进行缓存。

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

在5分钟后查看SQL queries似乎在Sql Server Profiler中没有活动时给出或花了30秒没有站点交互,为应用程序出现了几个“Audit Logout”条目,并且一旦发生这种情况然后它似乎需要10 - 15秒来刷新应用程序。 Sql Server Profiler上是否有空闲超时?

8 个答案:

答案 0 :(得分:4)

如果您在连接字符串中使用以下内容,这应该可以使用:

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

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

答案 1 :(得分:2)

您使用的是LMHOSTS文件吗?我们有同样的问题。默认情况下,LMHO​​STS文件缓存在10分钟后过期。系统闲置10分钟后,主机将在重新加载LMHOSTS文件之前使用广播消息,导致延迟。

答案 2 :(得分:1)

  

看完Sql Server Profiler后5分钟给出或   在Sql Server Profiler中没有活动需要30秒,没有站点   交互出现几个“审核注销”条目   应用程序,一旦发生,它似乎需要10 - 15   刷新应用程序的秒数。 Sql是否有空闲超时   服务器

这告诉我,问题很可能在于您的SQL服务器和/或与它的连接而不是您的应用程序。 SQL服务器使用connection pooling,SQL会经常搜索这些池并清理它们。您似乎遇到的延迟是清理了连接池(审核注销)并且您必须建立新连接。我会与你的SQL数据库人员交谈/工作。

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

答案 3 :(得分:0)

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

答案 4 :(得分:0)

由于第一次运行(每个应用程序?)速度很慢,您可能正在体验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()并在.ToList()上处理null结果和0长度列表结果。

答案 5 :(得分:0)

使用“Select getDate()”或其他一些廉价查询等简单查询创建一个访问SQL Server的简单网页。然后使用Pingdom或其他监视器等外部服务每隔30秒左右点击该页面。这应该保持联系温暖。

答案 6 :(得分:0)

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

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

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

答案 7 :(得分:0)

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

相关问题