gpt4 book ai didi

c# - 将 EF Core 从 2.2.6 升级到 3.1.3 时的 DbSet.Local.Any() 性能问题

转载 作者:行者123 更新时间:2023-12-04 10:15:39 30 4
gpt4 key购买 nike

有一个方法负责根据我们的 git commit 缓存数据库表中的哈希返回单个 GitCommit 对象。我们使用 Entity Framework 核心 , 当我有 将 nuget 包从 2.2.6 升级到 3.1.3 我意识到一个奇怪的性能问题。从 2.2.6 方法的第二次调用开始,条件 _dbContext.GitCommitCache.Local.Any() 拍了 0-1ms 要执行,在 3.1.3 上通常需要大约 150-220ms .我正在运行这种方法大约 9 到 1 万次,这是一个巨大的性能瓶颈。有什么相关的东西在引擎盖下发生了变化吗?这是否有任何简单的解决方案来保持原始性能?

    public async Task<GitCommit> GetCommitAsync(string hash)
{
try
{
await _semaphore.WaitAsync();
if (!_dbContext.GitCommitCache.Local.Any())
{
await _dbContext.GitCommitCache.LoadAsync();
}
var cacheEntry = await _dbContext.GitCommitCache.FindAsync(hash);

if (cacheEntry != null)
{
return cacheEntry;
}

var commit = await GetCommitDataAsync(hash);

try
{
_dbContext.GitCommitCache.Add(commit);
await _dbContext.SaveChangesAsync();
}
catch (DbUpdateException)
{
_dbContext.Entry(commit).State = EntityState.Detached;
}

return commit;
}
finally
{
_semaphore.Release();
}
}

最佳答案

issue #14001 ,即EF core 3.0.0,添加了DetectChanges访问 Local 时调用:

public override LocalView<TEntity> Local
{
get
{
CheckKey();

if (_context.ChangeTracker.AutoDetectChangesEnabled)
{
_context.ChangeTracker.DetectChanges();
}

return _localView ??= new LocalView<TEntity>(this);
}
}
DetectChanges是一种复杂且因此相对较慢的方法。幸运的是,如您所见,如果禁用 AutoDetectChangesEnabled暂时只打 Local ,您将再次加快速度。

我认为这样做是安全的,假设 _dbContext 中没有未检测到的更改当你输入方法时。

关于c# - 将 EF Core 从 2.2.6 升级到 3.1.3 时的 DbSet<TEntity>.Local.Any() 性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61074160/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com