【问题标题】:Asp.Net web app read query performanceAsp.Net web app 读取查询性能
【发布时间】:2014-02-22 13:14:21
【问题描述】:

使用 EntityFramework 5 (POCO)、SQL2012、ASP.NET-MVC4。

我的问题是,我的应用程序运行缓慢,原因是我上面提到的技术堆栈对在同一台服务器上运行的不同查询使用相同的连接。

假设我们有两个不同的查询,一个运行缓慢(最多一分钟),另一个运行非常快 1.2 秒。即使在只有一个用户即我的测试服务器上,如果我打开两个不同的浏览器窗口(共享同一个会话),先执行长查询,然后同时执行快速查询,当我查询时活动会话在 sql 服务器上的运行会话我只看到一个会话,因此,快速查询也卡在等待慢速查询。 我尝试了几件事并得到了随机结果: 我在连接字符串上禁用了池;

Pooling=False;

有时它会在两个不同的会话中运行这些查询,有时在一个会话中运行。我将最小池大小设置为 10,我认为在达到最小池大小之前,没关系,然后它开始使用相同的数据库会话。

另一件事是 MARS 是默认启用的; 我尝试删除它,(我不知道这个 atm 的全部影响,我没有测试所有东西,所以实际上我打算启用它。)我再次得到随机结果。

我使用了两种不同的浏览器,因此使用了 2 个不同的 IIS 会话,并获得了更好的结果。它为每个查询打开了两个数据库会话。

我们使用 MSDTC,因此所有事务都在事务上下文中运行,这会将所有打开的连接保留在可序列化设置中,因此我们必须也在事务范围中运行读取查询,并在该设置中选择读取未提交隔离级别。

因此,拥有相当强大的 SQL Server,如何防止 ASP.Net/ADO.Net/EF5 使用仍在服务器上运行查询的连接。

PS:我通过将连接字符串传递给 DbContexts 的构造函数来实例化 DbContext。 上面运行的查询在两个不同的上下文中。

【问题讨论】:

    标签: asp.net sql-server performance entity-framework ado.net


    【解决方案1】:

    这似乎解决了问题。

    [SessionState(System.Web.SessionState.SessionStateBehavior.ReadOnly)]
    public class SomeController: Controller
    

    如果您将会话状态设置为只读,Asp.Net MVC 允许您同时运行多个查询。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-01-13
      • 2020-11-07
      • 1970-01-01
      • 2014-05-25
      • 2011-01-31
      • 1970-01-01
      • 1970-01-01
      • 2010-10-14
      相关资源
      最近更新 更多