Robert 1 rok pred
rodič
commit
5d442d9ccc

+ 11 - 10
EVCB_OCPP.WSServer/EVCB_OCPP.WSServer.csproj

@@ -40,22 +40,23 @@
     </BootstrapperPackage>
   </ItemGroup>
   <ItemGroup>
-    <PackageReference Include="Dapper" Version="2.0.123" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.5" />
-    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.5" />
+    <PackageReference Include="Dapper" Version="2.0.143" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore" Version="7.0.10" />
+    <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="7.0.10" />
     <PackageReference Include="Microsoft.Extensions.Caching.Memory" Version="7.0.0" />
     <PackageReference Include="Microsoft.Extensions.Configuration.UserSecrets" Version="7.0.0" />
     <PackageReference Include="Microsoft.Extensions.Hosting" Version="7.0.1" />
     <PackageReference Include="Microsoft.Extensions.Http" Version="7.0.0" />
-    <PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="7.0.9" />
-    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.18.1" />
+    <PackageReference Include="Microsoft.Extensions.Logging.AzureAppServices" Version="7.0.10" />
+    <PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.5" />
     <PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
-    <PackageReference Include="NLog" Version="5.1.4" />
-    <PackageReference Include="NLog.Web.AspNetCore" Version="5.2.3" />
-    <PackageReference Include="Polly" Version="7.2.3" />
-    <PackageReference Include="Quartz.Extensions.Hosting" Version="3.6.2" />
+    <PackageReference Include="NLog" Version="5.2.3" />
+    <PackageReference Include="NLog.Web.AspNetCore" Version="5.3.3" />
+    <PackageReference Include="Polly" Version="7.2.4" />
+    <PackageReference Include="Quartz.Extensions.Hosting" Version="3.7.0" />
+    <PackageReference Include="RestSharp" Version="110.2.0" />
     <PackageReference Include="System.Data.DataSetExtensions" Version="4.5.0" />
-    <PackageReference Include="System.ServiceModel.Federation" Version="4.10.2" />
+    <PackageReference Include="System.ServiceModel.Federation" Version="6.0.0" />
     <PackageReference Include="EntityFramework" Version="6.4.4" />
     <PackageReference Include="log4net" Version="2.0.15" />
     <PackageReference Include="System.Threading.Tasks.Dataflow" Version="7.0.0" />

+ 1 - 1
EVCB_OCPP.WSServer/Helper/MeterValueGroupSingleHandler.cs

@@ -154,7 +154,7 @@ public class MeterValueGroupSingleHandler
         t2 = watch.ElapsedMilliseconds;
         foreach (var group in gruopParams)
         {
-            using SqlConnection sqlConnection = connectionFactory.Create();
+            using SqlConnection sqlConnection = await connectionFactory.CreateAsync();
             using var tans = sqlConnection.BeginTransaction();
 
             var tableName = group.Key;

+ 1 - 1
EVCB_OCPP.WSServer/Jobs/ServerSetFeeJob.cs

@@ -115,7 +115,7 @@ public class ServerSetFeeJob : IJob
 
         try
         {
-            using (SqlConnection conn = webDbConnectionFactory.Create())
+            using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
             {
                 var parameters = new DynamicParameters();
                 parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36);

+ 1 - 1
EVCB_OCPP.WSServer/Jobs/SmartChargingJob.cs

@@ -40,7 +40,7 @@ public class SmartChargingJob : IJob
     {
         //logger.LogDebug("{0} Started", nameof(SmartChargingJob));
         List<StationInfoDto> stations = null;
-        using (SqlConnection conn = webDbConnectionFactory.Create())
+        using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
         {
             string strSql = "SELECT[Id],[LBMode],[LBCurrent] as Availability FROM[StandardOCPP_Web].[dbo].[Station]" +
              "where LBMode = 1; ";

+ 17 - 3
EVCB_OCPP.WSServer/Message/CoreProfileHandler.cs

@@ -76,6 +76,9 @@ public class ID_ReaderStatus
 internal partial class ProfileHandler
 {
     private readonly ILogger logger;
+    private readonly BlockingTreePrintService blockingTreePrintService;
+    private readonly GoogleGetTimePrintService googleGetTimePrintService;
+
     //private readonly string webConnectionString;// = ConfigurationManager.ConnectionStrings[].ConnectionString;
     private readonly IDbContextFactory<MainDBContext> maindbContextFactory;
     private readonly SqlConnectionFactory<WebDBConetext> webDbConnectionFactory;
@@ -94,11 +97,15 @@ internal partial class ProfileHandler
         MeterValueDbService meterValueDbService,
         IBusinessServiceFactory businessServiceFactory,
         IMainDbService mainDbService,
-        ILogger<ProfileHandler> logger)
+        ILogger<ProfileHandler> logger,
+        BlockingTreePrintService blockingTreePrintService,
+        GoogleGetTimePrintService googleGetTimePrintService)
     {
         //webConnectionString = configuration.GetConnectionString("WebDBContext");
 
         this.logger = logger;
+        this.blockingTreePrintService = blockingTreePrintService;
+        this.googleGetTimePrintService = googleGetTimePrintService;
         this.maindbContextFactory = maindbContextFactory;
         this.webDbConnectionFactory = webDbConnectionFactory;
         this.meterValueDbService = meterValueDbService;
@@ -518,7 +525,7 @@ internal partial class ProfileHandler
                         string accountBalance = "0";
                         if (session.CustomerId.ToString().ToUpper() == "10C7F5BD-C89A-4E2A-8611-B617E0B41A73")
                         {
-                            using (SqlConnection conn = webDbConnectionFactory.Create())
+                            using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
                             {
                                 var parameters = new DynamicParameters();
                                 parameters.Add("@IdTag", _request.idTag, DbType.String, ParameterDirection.Input, 50);
@@ -860,6 +867,13 @@ internal partial class ProfileHandler
         logger.LogError("Processing " + action.ToString() + " costs " + watch.ElapsedMilliseconds / 1000 + " seconds"); ;
         }
         //}
+
+        if (watch.ElapsedMilliseconds > 5_000)
+        {
+            await blockingTreePrintService.PrintDbBlockingTree();
+            await googleGetTimePrintService.Print();
+        }
+
         return result;
     }
 
@@ -1173,7 +1187,7 @@ internal partial class ProfileHandler
                                             unitId: -1,
                                             transactionId: feedto.Id);
 
-                                        using (SqlConnection conn = webDbConnectionFactory.Create())
+                                        using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
                                         {
                                             var parameters = new DynamicParameters();
                                             parameters.Add("@IdTag", tx.StartIdTag, DbType.String, ParameterDirection.Input, 50);

+ 2 - 0
EVCB_OCPP.WSServer/Program.cs

@@ -56,6 +56,8 @@ namespace EVCB_OCPP.WSServer
                 {
                     //services.AddSingleton<MeterValueGroupSingleHandler>();
                     services.AddProtalServer(hostContext.Configuration);
+                    services.AddTransient<BlockingTreePrintService>();
+                    services.AddTransient<GoogleGetTimePrintService>();
                 })
                 .Build();
 

+ 1 - 1
EVCB_OCPP.WSServer/ProtalServer.cs

@@ -1228,7 +1228,7 @@ namespace EVCB_OCPP.WSServer
             try
             {
 
-                using (SqlConnection conn = webDbConnectionFactory.Create())
+                using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
                 {
                     var parameters = new DynamicParameters();
                     parameters.Add("@MachineId", client.MachineId, DbType.String, ParameterDirection.Input, 36);

+ 121 - 0
EVCB_OCPP.WSServer/Service/BlockingTreePrintService.cs

@@ -0,0 +1,121 @@
+using Dapper;
+using EVCB_OCPP.Domain;
+using EVCB_OCPP.WSServer.Helper;
+using Microsoft.Data.SqlClient;
+using Microsoft.Extensions.Logging;
+using System;
+using System.Collections.Generic;
+using System.ComponentModel.DataAnnotations.Schema;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+
+namespace EVCB_OCPP.WSServer.Service
+{
+    public class BlockingTreePrintService
+    {
+        public BlockingTreePrintService(ILogger<BlockingTreePrintService> logger,
+            SqlConnectionFactory<MainDBContext> connectionFactory)
+        {
+            this.logger = logger;
+            this.connectionFactory = connectionFactory;
+        }
+
+        public async Task PrintDbBlockingTree()
+        {
+            using var connection = await connectionFactory.CreateAsync();
+            var tree = await connection.QueryAsync<TreeStruct>(Command);
+
+            logger.LogCritical("Printing BlockingTree");
+            foreach (var data in tree)
+            {
+                logger.LogCritical($"{data.BlockingTree} {data.Type} {data.LoginName} {data.SourceDatabase} {data.SQLText} {data.CursorSQLText} {data.Database} {data.Schema} {data.Table} {data.WaitResource} {data.Command} {data.Application} {data.HostName} {data.LastBatchTime} ");
+            }
+        }
+
+        private const string Command = """
+                        /*  SQL Blocking Tree w/Cursor info
+            Thanks SQL Server Expert JOHNNYBNO 
+            */
+            IF OBJECT_ID('tempdb..#Blocks') IS NOT NULL
+                DROP TABLE #Blocks
+            SELECT   spid
+                    ,blocked
+                    ,REPLACE (REPLACE (st.TEXT, CHAR(10), ' '), CHAR (13), ' ' ) AS batch
+            INTO     #Blocks
+            FROM     sys.sysprocesses spr
+            	CROSS APPLY sys.dm_exec_sql_text(spr.SQL_HANDLE) st;
+
+            WITH BlockingTree (spid, blocking_spid, [level], batch)
+            AS
+            (
+                SELECT   blc.spid
+                        ,blc.blocked
+                        ,CAST (REPLICATE ('0', 4-LEN (CAST (blc.spid AS VARCHAR))) + CAST (blc.spid AS VARCHAR) AS VARCHAR (1000)) AS [level]
+                        ,blc.batch
+                FROM    #Blocks blc
+                WHERE   (blc.blocked = 0 OR blc.blocked = SPID) AND
+            			EXISTS (SELECT * FROM #Blocks blc2 WHERE blc2.BLOCKED = blc.SPID AND blc2.BLOCKED <> blc2.SPID)
+                UNION ALL
+                SELECT   blc.spid
+                        ,blc.blocked
+                        ,CAST(bt.[level] + RIGHT (CAST ((1000 + blc.SPID) AS VARCHAR (100)), 4) AS VARCHAR (1000)) AS [level]
+                        ,blc.batch
+                FROM     #Blocks AS blc
+            		INNER JOIN BlockingTree bt 
+            			ON	blc.blocked = bt.SPID
+                WHERE   blc.blocked > 0 AND
+            			blc.blocked <> blc.SPID
+            )
+            SELECT	N'' + ISNULL(REPLICATE (N'|         ', LEN (LEVEL)/4 - 2),'')
+                    + CASE WHEN (LEN(LEVEL)/4 - 1) = 0 THEN '' ELSE '|------  ' END
+                    + CAST (bt.SPID AS NVARCHAR (10)) AS BlockingTree
+                    ,spr.lastwaittype   AS [Type]
+                    ,spr.loginame       AS [LoginName]
+                    ,DB_NAME(spr.dbid)  AS [SourceDatabase]
+                    ,st.text            AS [SQLText]
+            		,CASE WHEN cur.sql_handle IS NULL THEN '' ELSE (SELECT [TEXT] FROM sys.dm_exec_sql_text (cur.sql_handle)) END  AS [CursorSQLText]
+                    ,DB_NAME(sli.rsc_dbid)  AS [Database]
+            		,OBJECT_SCHEMA_NAME(sli.rsc_objid,sli.rsc_dbid) AS [Schema]
+            		,OBJECT_NAME(sli.rsc_objid, sli.rsc_dbid) AS [Table]
+                    ,spr.waitresource   AS [WaitResource]
+                    ,spr.cmd            AS [Command]
+                    ,spr.program_name   AS [Application]
+                    ,spr.hostname       AS [HostName]
+                    ,spr.last_batch     AS [Last Batch Time]
+            FROM BlockingTree bt
+            	LEFT OUTER JOIN sys.sysprocesses spr 
+            		ON	spr.spid = bt.spid
+            	CROSS APPLY sys.dm_exec_sql_text(spr.SQL_HANDLE) st
+            	LEFT JOIN sys.dm_exec_cursors(0) cur
+            		ON	cur.session_id = spr.spid AND
+            			cur.fetch_status != 0
+            	JOIN sys.syslockinfo sli
+            		ON	sli.req_spid = spr.spid AND
+            			sli.rsc_type = 5 AND
+            			OBJECT_NAME(sli.rsc_objid, sli.rsc_dbid) IS NOT NULL
+            ORDER BY LEVEL ASC
+            """;
+        private readonly ILogger<BlockingTreePrintService> logger;
+        private readonly SqlConnectionFactory<MainDBContext> connectionFactory;
+    }
+
+    public class TreeStruct
+    {
+        public string BlockingTree { get; set; }
+        public string Type { get; set; }
+        public string LoginName { get; set; }
+        public string SourceDatabase { get; set; }
+        public string SQLText { get; set; }
+        public string CursorSQLText { get; set; }
+        public string Database { get; set; }
+        public string Schema { get; set; }
+        public string Table { get; set; }
+        public string WaitResource { get; set; }
+        public string Command { get; set; }
+        public string Application { get; set; }
+        public string HostName { get; set; }
+        public string LastBatchTime { get; set; }
+
+    }
+}

+ 2 - 2
EVCB_OCPP.WSServer/Service/ConnectionLogdbService.cs

@@ -114,7 +114,7 @@ public class ConnectionLogdbService : IConnectionLogdbService
         parameters.Add("Session", log.clientData.SessionID == null ? "123" : log.clientData.SessionID, DbType.String, size: 36);
 
         t1 = watch.ElapsedMilliseconds;
-        using var sqlConnection = sqlConnectionFactory.Create();
+        using var sqlConnection = await sqlConnectionFactory.CreateAsync();
         t2 = watch.ElapsedMilliseconds;
         await sqlConnection.ExecuteAsync(command, parameters);
 
@@ -215,7 +215,7 @@ public class ConnectionLogdbService : IConnectionLogdbService
         t0 = watch.ElapsedMilliseconds;
 
         t1 = watch.ElapsedMilliseconds;
-        using SqlConnection sqlConnection = sqlConnectionFactory.Create();
+        using SqlConnection sqlConnection = await sqlConnectionFactory.CreateAsync();
         using var tans = sqlConnection.BeginTransaction();
 
         t2 = watch.ElapsedMilliseconds;

+ 31 - 0
EVCB_OCPP.WSServer/Service/GoogleGetTimePrintService.cs

@@ -0,0 +1,31 @@
+using Microsoft.Extensions.Logging;
+using RestSharp;
+using System;
+using System.Collections.Generic;
+using System.Diagnostics;
+using System.Linq;
+using System.Text;
+using System.Threading.Tasks;
+using ZstdSharp.Unsafe;
+
+namespace EVCB_OCPP.WSServer.Service
+{
+    public class GoogleGetTimePrintService
+    {
+        private readonly ILogger<GoogleGetTimePrintService> logger;
+
+        public GoogleGetTimePrintService(ILogger<GoogleGetTimePrintService> logger)
+        {
+            this.logger = logger;
+        }
+
+        public async Task Print()
+        {
+            var client = new RestClient("http://www.google.com");
+            var stopWatch = Stopwatch.StartNew();
+            await client.ExecuteAsync(new RestRequest("",method: Method.Get));
+            stopWatch.Stop();
+            logger.LogInformation($"Cost {stopWatch.ElapsedMilliseconds}ms");
+        }
+    }
+}

+ 7 - 7
EVCB_OCPP.WSServer/Service/LoadingBalanceService.cs

@@ -44,7 +44,7 @@ namespace EVCB_OCPP.WSServer.Service
         public async Task<int> GetStationIdByMachineId(string machineId)
         {
             int stationId = 0;
-            using (SqlConnection conn = webDbConnectionFactory.Create())
+            using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
             {
                 var parameters = new DynamicParameters();
                 parameters.Add("@MachineId", machineId, DbType.String, ParameterDirection.Input, 36);
@@ -168,7 +168,7 @@ namespace EVCB_OCPP.WSServer.Service
         {
             bool result = false;
 
-            using (SqlConnection conn = mainDbConnectionFactory.Create())
+            using (SqlConnection conn = await mainDbConnectionFactory.CreateAsync())
             {
                 var parameters = new DynamicParameters();
                 parameters.Add("@ChargeBoxId", chargeBoxId, DbType.String, ParameterDirection.Input, 50);
@@ -219,7 +219,7 @@ namespace EVCB_OCPP.WSServer.Service
         async public Task<LoadBalanceSetting> GetLoadBalance(int stationId)
         {
             LoadBalanceSetting setting = null;
-            using (SqlConnection conn = webDbConnectionFactory.Create())
+            using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
             {
                 var parameters = new DynamicParameters();
                 parameters.Add("@StationId", stationId, DbType.Int32, ParameterDirection.Input);
@@ -234,7 +234,7 @@ namespace EVCB_OCPP.WSServer.Service
         async private Task<List<string>> GetIdsbyStationId(int stationId)
         {
             List<string> machineIds = new List<string>();
-            using (SqlConnection conn = webDbConnectionFactory.Create())
+            using (SqlConnection conn = await webDbConnectionFactory.CreateAsync())
             {
                 var parameters = new DynamicParameters();
                 parameters.Add("@StationId", stationId, DbType.Int16, ParameterDirection.Input);
@@ -282,7 +282,7 @@ namespace EVCB_OCPP.WSServer.Service
             List<string> results = new List<string>();
             List<string> machineIds = await GetIdsbyStationId(stationId);
             List<string> chargeboxids = new List<string>();
-            using (SqlConnection conn = mainDbConnectionFactory.Create())
+            using (SqlConnection conn = await mainDbConnectionFactory.CreateAsync())
             {
                 string onlineChargerSql = "Select ChargeBoxId from [dbo].[Machine] where Id in @machineIds and [Online]=1; ";
                 var onlineResult = await conn.QueryAsync<string>(onlineChargerSql, new { machineIds = machineIds.ToArray() });
@@ -311,10 +311,10 @@ namespace EVCB_OCPP.WSServer.Service
         /// <returns></returns>
         private async Task<(List<string>,int ratedPowers)> GetChargeBoxIdbyOfflineCharging(int stationId)
         {
-            List<string> machineIds = GetIdsbyStationId(stationId).Result;
+            List<string> machineIds = await GetIdsbyStationId(stationId);
             List<string> result = new List<string>();
             int ratedPowers = 0;
-            using (SqlConnection conn = mainDbConnectionFactory.Create())
+            using (SqlConnection conn = await mainDbConnectionFactory.CreateAsync())
             {
 
                 string offlineChargerSql = "Select ChargeBoxId from [dbo].[Machine] where Id in @machineIds and [Online]=0; ";

+ 1 - 1
EVCB_OCPP.WSServer/Service/MainDbService.cs

@@ -240,7 +240,7 @@ public class MainDbService : IMainDbService
         parameters.Add("@VendorId", Status.VendorId, DbType.String, ParameterDirection.Input, 255);
         parameters.Add("@VendorErrorCode", Status.VendorErrorCode, DbType.String, ParameterDirection.Input, 100);
 
-        using var conn = sqlConnectionFactory.Create();
+        using var conn = await sqlConnectionFactory.CreateAsync();
         await conn.ExecuteAsync("""
             update ConnectorStatus
             set

+ 3 - 3
EVCB_OCPP.WSServer/Service/MeterValueDbService.cs

@@ -147,7 +147,7 @@ public class MeterValueDbService
         parameters.Add("TransactionId", param.transactionId, DbType.Int32);
 
         t1 = watch.ElapsedMilliseconds;
-        using var sqlConnection = sqlConnectionFactory.Create();
+        using var sqlConnection = await sqlConnectionFactory.CreateAsync();
         t2 = watch.ElapsedMilliseconds;
         await sqlConnection.ExecuteAsync(command, parameters);
 
@@ -179,7 +179,7 @@ public class MeterValueDbService
         var gruopParams = parmsList.GroupBy(x => GetTableName(x.createdOn));
 
         t1 = watch.ElapsedMilliseconds;
-        using SqlConnection sqlConnection = sqlConnectionFactory.Create();
+        using SqlConnection sqlConnection = await sqlConnectionFactory.CreateAsync();
         using var tans = sqlConnection.BeginTransaction();
 
         t2 = watch.ElapsedMilliseconds;
@@ -273,7 +273,7 @@ public class MeterValueDbService
                 table.Rows.Add(row);
             }
             t1 = watcher.ElapsedMilliseconds;
-            using SqlConnection sqlConnection = sqlConnectionFactory.Create();
+            using SqlConnection sqlConnection = await sqlConnectionFactory.CreateAsync();
             using SqlBulkCopy sqlBulkCopy = new SqlBulkCopy(sqlConnection);
             t2 = watcher.ElapsedMilliseconds;
             sqlBulkCopy.BatchSize = group.Count();

+ 1 - 1
EVCB_OCPP.WSServer/Service/WebDbService.cs

@@ -25,7 +25,7 @@ public class WebDbService
     public async Task<List<string>> GetDenyModelNames()
     {
         return new List<string>() { "" };
-        using SqlConnection conn = webDbConnectionFactory.Create();
+        using SqlConnection conn = await webDbConnectionFactory.CreateAsync();
         string strSql = """
                 SELECT [Value] 
                 FROM [StandardOCPP_Web].[dbo].[KernelConfig]

+ 3 - 3
EVCB_OCPP.WSServer/appsettings.json

@@ -37,12 +37,12 @@
       "async": true,
       "f": {
         "type": "File",
-        "fileName": "${basedir}/logs/server/${shortdate}.log",
+        "fileName": "/home/logs/server/${shortdate}.log",
         "layout": "${longdate} ${uppercase:${level}} ${message}"
       },
       "ws": {
         "type": "File",
-        "fileName": "${basedir}/logs/server/WS_${shortdate}.log",
+        "fileName": "/home/logs/server/WS_${shortdate}.log",
         "layout": "${longdate} ${uppercase:${level}} ${message}"
       },
       "Console": {
@@ -51,7 +51,7 @@
       },
       "auth": {
         "type": "File",
-        "fileName": "${basedir}/logs/server/Auth_${shortdate}.log",
+        "fileName": "/home/logs/server/Auth_${shortdate}.log",
         "layout": "${longdate} ${callsite} ${uppercase:${level}} ${message}"
       }
     },