【问题标题】:Azure Entityframework SaveChanges Very SlowAzure Entityframework SaveChanges 非常慢
【发布时间】:2017-01-17 09:31:49
【问题描述】:

我在 azure 上托管一个 .Net Web Api,该 api 只是更新 sql server 数据库中的一行。这是我的更新代码:

using (Storage ctx = new Storage())
        {
            string json = JsonConvert.SerializeObject(ev, _jsonsettings);
            Data ex = ctx.dbsData.FirstOrDefault();
            if (ex == null)
                ctx.dbsData.Add(new Data() { Json = json, LastUpdate = DateTime.Now });
            else
            {
                ex.Json = json;
                ex.LastUpdate = DateTime.Now;
                ctx.Entry(ex).State = EntityState.Modified;
            }
            ctx.SaveChanges();
            return new HttpResponseMessage(HttpStatusCode.OK);
        }

我有第二种方法,它只清除表格:

 [HttpDelete]
    public HttpResponseMessage Clear()
    {
        using (Storage ctx = new Storage())
        {
            ctx.dbsData.RemoveRange(ctx.dbsData);
            ctx.SaveChanges();
            return new HttpResponseMessage(HttpStatusCode.OK);
        }
    }

另见我的 DbContext 类:

 public class Storage : DbContext
{
    public DbSet<Data> dbsData { get; set; }

    public Storage(string connectionstring) : base(connectionstring)
    {
        Configuration.LazyLoadingEnabled = false;
        Configuration.ProxyCreationEnabled = false;
        Configuration.ValidateOnSaveEnabled = false;
        Configuration.AutoDetectChangesEnabled = false;
    }

    public Storage() : this("tom")
    {

    }
}

我的问题是,这两种方法都非常慢。我发现如果我删除 SaveChanges() 命令,它的执行速度会更快。所以我的问题是如何提高性能以及为什么更新/删除一行需要这么长时间?

【问题讨论】:

  • 删除 SaveChanges() 速度更快的原因是没有它,您的数据库不会更新。 SaveChanges() 是在数据库上实际执行查询的点。对于一排,它不应该很慢。但是需要更多信息,您存储在其中一列中的 json 数据有多大?它最终会保存还是只是超时?
  • 我知道 savechanges() 会更新数据库。我不明白为什么它这么慢(〜10秒)。我的 json 大小约为 500kb。如果我在我的 sqlexpress 服务器上本地尝试它,它会立即存储,没有任何延迟。
  • 您能否提供有关您使用什么 Azure 的更多信息?它是带有 Azure SQL 数据库的 VM 还是应用服务?当您在本地尝试时,您的意思是您将 Azure WebApi 连接字符串设置为本地 sqlexpress?您是否尝试过将本地连接字符串设置为 Azure SQL 数据库?
  • 我正在使用应用服务(基本)和 sql server 数据库(基本 5 dtus)。如果只是为了测试就足够了。

标签: entity-framework azure asp.net-web-api2


【解决方案1】:

这完全取决于表 ctx.dbsData 中有多少数据。 ctx.dbsData.RemoveRange(ctx.dbsData);仅将这些行标记为删除。但更改只会在调用 SaveChanges() 后反映; 为了加快处理速度,您可以进行异步调用。

【讨论】:

  • 在说“为了更快的处理,您可以进行异步调用”时要小心。虽然使用异步调用可以提供更好的整体性能,但孤立的说法是不正确的。这里stackoverflow.com/a/30043327/692830 是比较与 SaveChanges 和 SaveChangeAsync 的区别的一个很好的答案。另外,您所说的最好作为评论,它不提供问题的答案,只是提供更多问题
  • 表格总是只有一行
  • @ManuelBleimuth 那么它不应该花那么多时间。我需要看看你的代码。
  • @Pavvy 你可以在上面看到我的整个代码,我不知道为什么这么慢。我的 json 通常有大约 500kb,但这不应该影响删除命令。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-10-06
  • 1970-01-01
  • 2021-07-20
  • 1970-01-01
  • 2021-01-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多