From e1ba4e17779918beb13f2d35e4e11d664576b724 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=A4=D1=80=D0=BE=D0=BB=D0=BE=D0=B2?= Date: Wed, 10 Nov 2021 17:52:28 +0500 Subject: [PATCH] fix CacheTable refresh throttling --- AsbCloudDb/UsefulQueries/lost_telemetries.sql | 3 ++ .../Services/Cache/CacheTable.cs | 37 ++++++++++--------- 2 files changed, 22 insertions(+), 18 deletions(-) create mode 100644 AsbCloudDb/UsefulQueries/lost_telemetries.sql diff --git a/AsbCloudDb/UsefulQueries/lost_telemetries.sql b/AsbCloudDb/UsefulQueries/lost_telemetries.sql new file mode 100644 index 00000000..7b31e11b --- /dev/null +++ b/AsbCloudDb/UsefulQueries/lost_telemetries.sql @@ -0,0 +1,3 @@ +SELECT * from t_telemetry +left outer join t_well on t_telemetry.id = t_well.id_telemetry +where t_well.id is null \ No newline at end of file diff --git a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs index a1d47325..528f09d2 100644 --- a/AsbCloudInfrastructure/Services/Cache/CacheTable.cs +++ b/AsbCloudInfrastructure/Services/Cache/CacheTable.cs @@ -14,7 +14,8 @@ namespace AsbCloudInfrastructure.Services.Cache { private const int semaphoreTimeout = 5_000; private static readonly SemaphoreSlim semaphore = new(1); - private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(3); + private static readonly TimeSpan minPeriodRefresh = TimeSpan.FromSeconds(5); + private static readonly string nameOfTEntity = typeof(TEntity).Name; private readonly DbContext context; private (DateTime refreshDate, IEnumerable entities) data; @@ -93,27 +94,27 @@ namespace AsbCloudInfrastructure.Services.Cache private void InternalRefresh(bool force) { - if (!force && (data.refreshDate + minPeriodRefresh >= DateTime.Now)) - return; - - cached.Clear(); - var entities = dbSet.AsNoTracking().ToList(); - Trace.WriteLine($"CacheTable<{typeof(TEntity).Name}> refresh"); - cached.AddRange(entities); - data.refreshDate = DateTime.Now; + if (force || data.refreshDate + minPeriodRefresh > DateTime.Now) + { + cached.Clear(); + var entities = dbSet.AsNoTracking().ToList(); + Trace.WriteLine($"CacheTable<{nameOfTEntity}> refresh"); + cached.AddRange(entities); + data.refreshDate = DateTime.Now; + } } private async Task InternalRefreshAsync(bool force, CancellationToken token = default) { - if (!force && (data.refreshDate + minPeriodRefresh >= DateTime.Now)) - return; - - cached.Clear(); - var entities = await context.Set().AsNoTracking() - .ToListAsync(token).ConfigureAwait(false); - Trace.WriteLine($"CacheTable<{typeof(TEntity).Name}> refresh"); - cached.AddRange(entities); - data.refreshDate = DateTime.Now; + if (force || data.refreshDate + minPeriodRefresh > DateTime.Now) + { + cached.Clear(); + var entities = await context.Set().AsNoTracking() + .ToListAsync(token).ConfigureAwait(false); + Trace.WriteLine($"CacheTable<{nameOfTEntity}> refreshAsync"); + cached.AddRange(entities); + data.refreshDate = DateTime.Now; + } } public int Refresh(bool force)