gpt4 book ai didi

c# - 应用程序长时间空闲后,EF Core AddAsync 和 SaveChangesAsync 稍微变慢

转载 作者:太空宇宙 更新时间:2023-11-03 14:46:26 25 4
gpt4 key购买 nike

我目前正在为我的 API 做基准测试,我注意到使用 EF Core 的第一次保存操作有点延迟。这种情况是在一段时间不活动后(假设 18 小时),第一个保存操作需要 1.5 秒才能执行,随后最多为 100 毫秒。下面是代码片段,

         public async Task SaveLog(Log log_item)
{
// Set created and updated date/time
log_item.created = DateTime.UtcNow;
log_item.updated = DateTime.UtcNow;

if (!(log_item.Month % 2 == 0))
// Odd
{
var log_item_odd = log_item.ConvertLogToOdd();
await _dbContext.Log_Odd.AddAsync(log_item_odd);
}
else
// Even
{
var log_item_even = log_item.ConvertLogToEven();
await _dbContext.Log_Even.AddAsync(log_item_even);
}

await _dbContext.SaveChangesAsync();
}

以下是此操作的执行时间,以及对我捕获的日志执行的后续更新,以毫秒为单位。

[2018-12-29 06:25:00.199] [ADD_LOG] SaveLog 1556  
[2018-12-29 06:25:01.056] [UPDATE_LOG] UpdateLog 362
[2018-12-29 06:27:13.652] [ADD_LOG] SaveLog 4
[2018-12-29 06:27:13.886] [UPDATE_LOG] UpdateLog 9
[2018-12-29 06:29:01.633] [ADD_LOG] SaveLog 4
[2018-12-29 06:29:01.846] [UPDATE_LOG] UpdateLog 4
[2018-12-29 06:56:21.544] [ADD_LOG] SaveLog 53
[2018-12-29 06:56:21.996] [UPDATE_LOG] UpdateLog 5
[2018-12-29 07:11:58.813] [ADD_LOG] SaveLog 94
[2018-12-29 07:11:59.051] [UPDATE_LOG] UpdateLog 5
[2018-12-29 07:16:12.241] [ADD_LOG] SaveLog 3
[2018-12-29 07:16:12.639] [UPDATE_LOG] UpdateLog 4

我找不到任何与 EF Core 在一段时间不活动后需要一些时间启动相关的内容,对此有解释吗? *我使用 PostgreSQL 作为数据库。

感谢任何帮助,谢谢。

最佳答案

通常所有的提供者都有一些实现来在一段时间的空闲时间后修剪空闲连接。

第一个命令需要更多时间来创建和打开连接。下一个命令将使用池连接,并且速度更快。然后,在空闲特定时间后,提供商会修剪池并关闭空闲连接。然后在空闲时间之后的下一个命令需要打开一个连接,这再次需要时间。

例如 Npgsql , ConnectorPool 中有一个 PruneIdleConnectors它根据 NpgsqlConnectionStringBuilder.ConnectionIdleLifetime 的值进行清理默认为 5 分钟。这里有相关pooling参数:

  • Connection Idle Lifetime:如果所有连接数超过 MinPoolSize,则在关闭池中的空闲连接之前等待的时间(以秒为单位)。仅从 3.1 开始。 默认为 300 秒。
  • 连接修剪间隔:池在尝试修剪超出空闲生命周期的空闲连接之前等待的秒数(请参阅 ConnectionIdleLifetime)。仅从 3.1 开始。 默认为 10 秒。

对于 ADO.NET SqlConnection pooling这个时间大约是 4-8 分钟:

连接池会在连接空闲大约 4-8 分钟后从池中删除连接,或者如果池器检测到与服务器的连接已被切断。

注意:评论中也已经提到,还有一些其他因素可能会影响首次执行时间,包括 DBMS 中的 EF 上下文池和查询执行计划缓存。但通常最耗时的是重新打开连接。

关于c# - 应用程序长时间空闲后,EF Core AddAsync 和 SaveChangesAsync 稍微变慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53968034/

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