From a876ac049515c4c32415e9bbc729955e0c8c861a Mon Sep 17 00:00:00 2001 From: Samuele Locatelli Date: Tue, 24 Oct 2023 09:24:52 +0200 Subject: [PATCH] SPEC: - Update con statistiche DB calcolate - aggiunto obj connesisone cadmin con timeout a 5 minuti --- MP.Data/Controllers/MpSpecController.cs | 7 +- MP.Data/MP.Data.csproj | 2 +- MP.Data/MoonProAdminContext.cs | 75 ++++++++++++ MP.Data/Utils.cs | 1 + MP.SPEC/Data/MpDataService.cs | 54 ++++++++- MP.SPEC/MP.SPEC.csproj | 6 +- MP.SPEC/Pages/FluxLogStatus.razor | 24 ++-- MP.SPEC/Pages/FluxLogStatus.razor.cs | 151 ++++++++++++++---------- MP.SPEC/Resources/ChangeLog.html | 2 +- MP.SPEC/Resources/VersNum.txt | 2 +- MP.SPEC/Resources/manifest.xml | 2 +- 11 files changed, 242 insertions(+), 84 deletions(-) create mode 100644 MP.Data/MoonProAdminContext.cs diff --git a/MP.Data/Controllers/MpSpecController.cs b/MP.Data/Controllers/MpSpecController.cs index 47117287..8be106cb 100644 --- a/MP.Data/Controllers/MpSpecController.cs +++ b/MP.Data/Controllers/MpSpecController.cs @@ -724,9 +724,10 @@ namespace MP.Data.Controllers /// public async Task ForceDbMaint(bool doExec, bool doUpdStat, bool doSave, int minPgCnt, int minAvgFrag, int maxAvgFragReb) { - Log.Info($"Inizio ForceDbMaint"); + Log.Info($"Inizio ForceDbMaint on MoonProAdminContext"); bool fatto = false; - using (var dbCtx = new MoonProContext(_configuration)) + // uso context admin x query lunghe + using (var dbCtx = new MoonProAdminContext(_configuration)) { var pFlgExec = new SqlParameter("@FlgExec", doExec ? "Y" : "N"); var pFlgUpdStat = new SqlParameter("@FlgUpdStat", doUpdStat ? "Y" : "N"); @@ -741,7 +742,7 @@ namespace MP.Data.Controllers //.ExecuteSqlRaw("EXEC man.stp_Utility_Maintanance @FlgExec, @FlgUpdStat, @FlgSave, @min_page_count, @min_avg_fragmentation_in_percent, @max_avg_fragmentation_per_rebuild", pFlgExec, pFlgUpdStat, pFlgSave, pMinPgCnt, pMinAvgFrag, pMaxAvgFrag); fatto = true; } - Log.Info($"FINE ForceDbMaint"); + Log.Info($"FINE ForceDbMaint on MoonProAdminContext"); return fatto; } diff --git a/MP.Data/MP.Data.csproj b/MP.Data/MP.Data.csproj index 97880123..36747f66 100644 --- a/MP.Data/MP.Data.csproj +++ b/MP.Data/MP.Data.csproj @@ -20,7 +20,7 @@ - + diff --git a/MP.Data/MoonProAdminContext.cs b/MP.Data/MoonProAdminContext.cs new file mode 100644 index 00000000..4e9b8ecd --- /dev/null +++ b/MP.Data/MoonProAdminContext.cs @@ -0,0 +1,75 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.Extensions.Configuration; +using MP.Data.DatabaseModels; +using MP.Data.DTO; +using NLog; + +#nullable disable +// +// This is here so CodeMaid doesn't reorganize this document +// +namespace MP.Data +{ + public partial class MoonProAdminContext : DbContext + { + #region Private Fields + + private static NLog.Logger Log = LogManager.GetCurrentClassLogger(); + + private IConfiguration _configuration; + + #endregion Private Fields + + #region Public Constructors + + public MoonProAdminContext(IConfiguration configuration) + { + _configuration = configuration; + // timeout esecuzione a 5 min (std: 30 sec)... + Database.SetCommandTimeout(TimeSpan.FromSeconds(300)); + } + + public MoonProAdminContext(DbContextOptions options) : base(options) + { + } + + #endregion Public Constructors + + #region Private Methods + + partial void OnModelCreatingPartial(ModelBuilder modelBuilder); + + #endregion Private Methods + + #region Protected Methods + + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (!optionsBuilder.IsConfigured) + { + string connString = _configuration.GetConnectionString("Mp.Data"); + if (string.IsNullOrEmpty(connString)) + { + connString = _configuration.GetConnectionString("Mp.Mon"); + } + if (string.IsNullOrEmpty(connString)) + { + connString = _configuration.GetConnectionString("Mp.STATS"); + } + + optionsBuilder.UseSqlServer(connString); + } + } + + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.HasAnnotation("Relational:Collation", "SQL_Latin1_General_CP1_CI_AS"); + + OnModelCreatingPartial(modelBuilder); + } + + #endregion Protected Methods + } +} \ No newline at end of file diff --git a/MP.Data/Utils.cs b/MP.Data/Utils.cs index 5b89a344..a0960900 100644 --- a/MP.Data/Utils.cs +++ b/MP.Data/Utils.cs @@ -233,6 +233,7 @@ namespace MP.Data public const string redisAKVKey = redisBaseAddr + "Cache:AKV"; public const string redisParetoFLKey = redisBaseAddr + "Cache:ParetoFL"; public const string redisStatsProcFL = redisBaseAddr + "Stats:ProcessFL"; + public const string redisStatsDbMaint = redisBaseAddr + "Stats:DbMaint"; public const string redisDossByMac = redisBaseAddr + "Cache:DossByMac"; public const string redisFluxByMac = redisBaseAddr + "Cache:FluxByMac"; public const string redisFluxLogFilt = redisBaseAddr + "Cache:FluxLogFilt"; diff --git a/MP.SPEC/Data/MpDataService.cs b/MP.SPEC/Data/MpDataService.cs index 17cf0722..49810cd5 100644 --- a/MP.SPEC/Data/MpDataService.cs +++ b/MP.SPEC/Data/MpDataService.cs @@ -453,6 +453,27 @@ namespace MP.SPEC.Data return await Task.FromResult(dbController.ConfigUpdate(updRec)); } + /// + /// Restituisce le statistiche di DB maintenance eseguite + /// + /// + public Dictionary DbDedupStats() + { + Dictionary actStats = new Dictionary(); + string currKey = $"{Utils.redisStatsDbMaint}"; + // recupero i record statistiche correnti + RedisValue rawData = redisDb.StringGet(currKey); + if (rawData.HasValue) + { + var rawStats = JsonConvert.DeserializeObject>($"{rawData}"); + if (rawStats != null) + { + actStats = rawStats; + } + } + return actStats; + } + /// /// Dispose del connettore ai dati /// @@ -705,7 +726,8 @@ namespace MP.SPEC.Data { List procStats = await dbController.FluxLogDataRedux(idxMaccSel, fluxList, currPeriodo, valMode, intReq, maxItem); // effettuo merge statistiche... - ProcStatMerge(procStats); + ProcDedupStatMerge(procStats); + // svuoto cache await FlushCacheFluxLog(); } @@ -790,7 +812,12 @@ namespace MP.SPEC.Data /// public async Task ForceDbMaint(bool doExec = true, bool doUpdStat = true, bool doSave = true, int minPgCnt = 1000, int minAvgFrag = 10, int maxAvgFragReb = 50) { + Stopwatch sw = Stopwatch.StartNew(); await dbController.ForceDbMaint(doExec, doUpdStat, doSave, minPgCnt, minAvgFrag, maxAvgFragReb); + sw.Stop(); + // registro statistiche esecuzione + RecDbMaintStat(sw.Elapsed); + // svuoto cache await FlushCacheFluxLog(); } @@ -1766,7 +1793,12 @@ namespace MP.SPEC.Data return TimeSpan.FromMinutes(rndValue); } - protected bool ProcStatMerge(List procStats) + /// + /// Merge statistiche Dedup + /// + /// + /// + protected bool ProcDedupStatMerge(List procStats) { bool answ = false; List actStats = ProcFLStats(); @@ -1805,6 +1837,24 @@ namespace MP.SPEC.Data return answ; } + /// + /// Merge statistiche DB Maintenance + /// + /// + /// + protected bool RecDbMaintStat(TimeSpan duration) + { + bool answ = false; + Dictionary actStats = DbDedupStats(); + // aggiungo record! + actStats.Add(DateTime.Now, duration.TotalSeconds); + // salvo NUOVO record statistiche + string currKey = $"{Utils.redisStatsDbMaint}"; + var rawData = JsonConvert.SerializeObject(actStats); + redisDb.StringSet(currKey, rawData); + return answ; + } + #endregion Protected Methods #region Private Fields diff --git a/MP.SPEC/MP.SPEC.csproj b/MP.SPEC/MP.SPEC.csproj index b90e07e9..0947ddfb 100644 --- a/MP.SPEC/MP.SPEC.csproj +++ b/MP.SPEC/MP.SPEC.csproj @@ -5,7 +5,7 @@ enable enable MP.SPEC - 6.16.2310.2320 + 6.16.2310.2409 @@ -39,8 +39,8 @@ - - + + diff --git a/MP.SPEC/Pages/FluxLogStatus.razor b/MP.SPEC/Pages/FluxLogStatus.razor index 754ec856..caf43e25 100644 --- a/MP.SPEC/Pages/FluxLogStatus.razor +++ b/MP.SPEC/Pages/FluxLogStatus.razor @@ -35,11 +35,11 @@ @if (isProcessing) { - + } else if (isReindexing) { - + } else { @@ -49,11 +49,16 @@