【发布时间】:2020-11-25 04:28:09
【问题描述】:
我们正在使用 Azure Function 与 Azure SQL Db 对话。我们使用最新版本的 Azure 函数 3.1 以及 .net core 3 和 EF core。
最近我们在日志中看到以下错误消息 Microsoft.Data.SqlClient.SqlException (0x80131904): Resource ID : 1. 弹性池的请求限制为 420 并且已达到。请参阅“http://go.microsoft.com/fwlink/?LinkId=267637”以获得帮助。 我们还查看了应用洞察,发现在此期间连接数达到了 1400 左右。
我们在启动文件中使用以下语句将 DbContext 添加到服务中。
builder.Services.AddDbContextPool<OurDbContext>(options =>
{
options.UseSqlServer("connectionstring");
});
OurDbContext 类具有以下构造函数,
public OurDbContext(DbContextOptions<OurDbContext> options)
: base(options)
{
}
然后我们将 OurDbContext 类注入到不同的存储库中,这些存储库使用此上下文与 SQL 对话。 类似于下面:
public class Repo : IRepo
{
public Repo(OurDbContext ourDbContext)
{
}
public async Task AddAsync(Entity entity)
{
ourDbContext.AddAsync(entity);
ourDbContext.SaveChangesAsync()
}
}
我们将这些 repos 注入到 Function 类中并调用上述方法,例如
await _repo.AddAsync()
由于打开的连接数很多,您是否发现上述结构中存在任何问题?
我相信由于某种原因,一旦函数完成执行,上下文/连接就不会被释放。
正在考虑对 dbContext 使用 using 语句,以便在我们完成 db 查询执行后立即处理它。但是,我不确定我们是否可以在启动类中使用 AddDbContextPool,因为它需要选项。此外,OurDbContext 绑定到此选项。可能必须在 OurDbContext 类中使用我不知道如何与 AddDbContextPool 一起使用的 onConfiguring 方法?
任何建议都会非常有用。谢谢!
更新 1 更新了评论中与问题相关的更多细节: 以下是我的方法:
public async Task<List<EntityXyz>()
{
var xyzToBeUpdated = new EntityXyz()
{
mapping of few fields;
}
OurDbContext.Update(xyzToBeUpdated);
var xyzToBeAdded = new EntityXyz
{
mapping of few fields;
}
await OurDbContext.AddRangeAsync(xyzToBeAdded);
await OurDbContext.SaveChangesAsync();
xyzToBeAdded.Add(xyzToBeUpdated);
return xyzToBeAdded;
}
【问题讨论】:
-
也许你确实有那么多并发用户或设备调用你的函数,在这种情况下你要么需要扩展,要么扩展你的资源
标签: entity-framework asp.net-core .net-core entity-framework-core azure-functions