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 @@