性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷

🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷


📚 目錄

  • 🚀 性能剖析:在 ABP 框架中集成 MiniProfiler 實現性能可視化診斷
    • 一、為什么選擇 MiniProfiler? 🧐
    • 二、集成 MiniProfiler 到 ABP 項目 🛠?
      • 1?? 安裝 NuGet 包
      • 2?? 在 `MyProjectWebModule.cs` 中注冊
        • 集成流程示意圖
      • 3?? 在中間件中啟用(僅限開發環境)
        • 中間件流程圖
    • 三、前端頁面嵌入 Profiler UI 🎨
      • 1?? Razor Pages / MVC
      • 2?? Blazor Server
        • 前端嵌入流程圖
    • 四、實戰演示:控制器或應用服務中標記關鍵耗時段 ??
    • 五、進階實踐 🚀
      • 1?? AOP 攔截全站性能
        • 自定義攔截器:`MiniProfilerInterceptor`
        • 注冊攔截器并應用(示例:攔截所有應用服務)
        • AOP 攔截流程圖
      • 2?? HttpClient 自動打點
        • HttpClient 打點流程圖
      • 3?? 健康檢查接口打點
        • 健康檢查打點流程圖
    • 六、安全與生產建議 🔒
    • 七、示例項目與復現方式 🏗?
      • 快速啟動步驟


一、為什么選擇 MiniProfiler? 🧐

在 ABP 應用開發中,很容易遇到以下性能難題:

  • 調用鏈復雜:控制器 → 應用服務 → 領域服務 → 倉儲,每層調用都可能出現瓶頸。
  • EF Core 查詢慢:未加索引、N+1 查詢或大表掃描,經常導致數據庫成為性能瓶頸。
  • 第三方 API 響應慢:調用外部服務時耗時不可見,無法快速定位是哪一步出現問題。

我們需要一個能快速診斷性能瓶頸零侵入前端可視化的工具。
MiniProfiler 正符合這些需求:

  • ? 輕量嵌入式性能分析器;對代碼幾乎零改動即可集成
  • ? 支持 SQL、服務方法、HttpClient 等多種調用的耗時可視化
  • ? 前端浮窗展示;無需跳轉后臺即可查看 Profiling 結果

二、集成 MiniProfiler 到 ABP 項目 🛠?

下面演示如何在 ABP vNext 項目中集成 MiniProfiler。請確保您的項目滿足“適用環境”所列版本要求。

1?? 安裝 NuGet 包

dotnet add package MiniProfiler.AspNetCore.Mvc --version 5.0.2
dotnet add package MiniProfiler.EntityFrameworkCore --version 5.0.2

📌 建議使用 5.x 或更高版本,兼容 .NET 6/7/8、EF Core 6/7/8。如果未來 MiniProfiler 發布 6.x 以上大版本,也請以最新穩定版為準。
📌 若您的項目使用 EF Core 5 或 ABP v6,請訪問 MiniProfiler GitHub 查詢對應版本。

2?? 在 MyProjectWebModule.cs 中注冊

using Microsoft.Extensions.Configuration;
using StackExchange.Profiling;
using StackExchange.Profiling.Storage;
using Volo.Abp.DynamicProxy;
using Volo.Abp.Modularity;
using Volo.Abp.AspNetCore.Mvc;[DependsOn(typeof(AbpAspNetCoreMvcModule),typeof(AbpDynamicProxyModule) // 確保啟用了動態代理
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){var services = context.Services;var configuration = context.Services.GetConfiguration();services.AddMiniProfiler(options =>{// 路由前綴,訪問地址為 /profileroptions.RouteBasePath = "/profiler";options.ColorScheme = StackExchange.Profiling.ColorScheme.Auto;options.EnableServerTimingHeader = true;options.TrackConnectionOpenClose = true;// 🔐 安全控制:僅允許擁有 "Admin" 角色的用戶訪問options.Authorize = request =>request.HttpContext.User?.IsInRole("Admin") == true;// 👥 多用戶區分:從 HttpContext.User 提取用戶名options.UserProvider = request =>{var user = request.HttpContext.User;return user?.Identity?.IsAuthenticated == true? user.Identity.Name: "Anonymous";};// 💾 持久化存儲(可選):將 Profiling 數據保存到 SQL Server// 請先在 appsettings.json 中添加連接字符串 "ProfilerDb"// options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);// 🔴 或者使用 Redis 存儲(適合高并發、多實例環境)// options.Storage = new RedisStorage(configuration.GetConnectionString("RedisConnection"));})// EF Core 6/7/8 推薦 .AddEntityFramework(); 如果報錯則改為 .AddEntityFrameworkCore().AddEntityFramework();}
}
集成流程示意圖
安裝 NuGet 包
在 MyProjectWebModule 配置 AddMiniProfiler
配置安全與存儲選項
注冊 AOP 攔截器(可選)
啟用中間件:UseMiniProfiler()

3?? 在中間件中啟用(僅限開發環境)

using Microsoft.AspNetCore.Builder;
using Microsoft.Extensions.Hosting;
using Volo.Abp;public class MyProjectWebModule : AbpModule
{public override void OnApplicationInitialization(ApplicationInitializationContext context){var app = context.GetApplicationBuilder();var env = context.GetEnvironment();if (env.IsDevelopment()){// ?? 請務必將 UseMiniProfiler 放在 UseRouting 之前,才能捕獲整個請求管道的耗時app.UseMiniProfiler();}app.UseRouting();app.UseAuthentication();app.UseAuthorization();app.UseConfiguredEndpoints();}
}

💡 提示:

  • 如果使用的是 ABP v6 或更早版本,請將 app.UseConfiguredEndpoints() 替換為:
    app.UseEndpoints(endpoints => { endpoints.MapControllers(); });
    
  • 確保先調用 app.UseAuthentication()app.UseAuthorization(),否則 HttpContext.User 中信息可能為空,影響 AuthorizeUserProvider 的邏輯。
中間件流程圖
開發環境
生產環境
請求進來
環境檢測
UseMiniProfiler
跳過 UseMiniProfiler
UseRouting
UseAuthentication → UseAuthorization → UseEndpoints

三、前端頁面嵌入 Profiler UI 🎨

后端功能集成完成后,需要在前端布局頁插入 MiniProfiler 的渲染代碼,才能看到浮窗效果。以下示例展示了 Razor Pages/MVC 與 Blazor Server 的差異。

1?? Razor Pages / MVC

_Layout.cshtml 的末尾(即 </body> 之前)插入:

@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><title>MyProject</title><!-- … 其他頭部內容 … -->
</head>
<body>@RenderBody()@* 如果當前請求中有 MiniProfiler,則渲染浮動窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}
</body>
</html>

📌 注意:

  • 確保在 _ViewImports.cshtml 中添加 @using StackExchange.Profiling,否則會提示找不到 MiniProfiler
  • 如果布局頁與 _ViewImports.cshtml 不在同一路徑,需在布局頁最頂部手動引入 @using StackExchange.Profiling

2?? Blazor Server

_Host.cshtml 的末尾(即 </body> 之前)插入:

@using StackExchange.Profiling<!DOCTYPE html>
<html lang="zh-CN">
<head><meta charset="utf-8" /><base href="~/" /><title>MyBlazorApp</title><!-- … 其他頭部內容 … -->
</head>
<body><app><component type="typeof(App)" render-mode="ServerPrerendered" /></app>@* 如果當前請求中有 MiniProfiler,則渲染浮動窗口 *@@if (MiniProfiler.Current != null){@await MiniProfiler.Current.RenderIncludes()}<script src="_framework/blazor.server.js"></script>
</body>
</html>

🔔 提示:

  • Blazor Server 環境下同樣需要引入 @using StackExchange.Profiling;如果未能渲染浮窗,可檢查 CORS 配置是否允許跨域訪問 /profiler/includes.js
前端嵌入流程圖
不為空
為空
前端布局加載
檢查 MiniProfiler.Current
渲染浮動窗口
不渲染
顯示調用樹、SQL、HTTP 等信息

四、實戰演示:控制器或應用服務中標記關鍵耗時段 ??

集成并渲染 UI 后,我們可以在業務代碼里手動打點,直觀查看各步驟耗時。下面示例展示在應用服務(ApplicationService)中如何妥善使用 Step 與異常處理。

using System;
using System.Threading.Tasks;
using StackExchange.Profiling;
using Volo.Abp.Application.Services;public class OrderAppService : ApplicationService
{private readonly IOrderRepository _orderRepository;public OrderAppService(IOrderRepository orderRepository){_orderRepository = orderRepository;}public async Task<OrderDto> GetAsync(Guid id){// 獲取當前請求的 Profiler 實例,若在生產環境關閉則 profiler == nullvar profiler = MiniProfiler.Current;IDisposable step = null;try{// 第一層打點:🔍 查詢訂單數據step = profiler?.Step("🔍 查詢訂單數據");var order = await _orderRepository.GetAsync(id);// 第二層打點:📦 映射 Order → DTOusing (profiler?.Step("📦 映射 Order → DTO")){return ObjectMapper.Map<Order, OrderDto>(order);}}catch (Exception ex){// 在異常發生時新增一個標記,記錄錯誤信息profiler?.Step($"? 查詢訂單數據失敗: {ex.Message}");throw;}finally{// 無論成功或異常,都要關閉第一層 Stepstep?.Dispose();}}
}

🧠 建議:

  • 只對關鍵步驟進行打點,避免在每一行都嵌套 Step,否則 UI 層次過多、可讀性下降。
  • 在異常處理時,要確保前面的 step?.Dispose() 能在 finally 中執行,不要在捕捉異常后忘記關閉先前 Step。

五、進階實踐 🚀

1?? AOP 攔截全站性能

如果不想在每個方法都手動寫 Step,可利用 ABP vNext 的動態代理攔截器,為所有應用服務或 Controller 自動打點。

自定義攔截器:MiniProfilerInterceptor
using System.Threading.Tasks;
using Castle.DynamicProxy;
using StackExchange.Profiling;public class MiniProfilerInterceptor : IAsyncInterceptor
{public async Task InterceptAsync(IInvocation invocation){var profiler = MiniProfiler.Current;using (profiler?.Step($"[Profiling] {invocation.TargetType.Name}.{invocation.Method.Name}")){await invocation.ProceedAsync();}}// 如果還需要攔截同步方法,可實現 IInterceptor:// public void Intercept(IInvocation invocation) { … }
}
注冊攔截器并應用(示例:攔截所有應用服務)
using Volo.Abp;
using Volo.Abp.Modularity;
using Volo.Abp.DynamicProxy;[DependsOn(typeof(AbpDynamicProxyModule) // 確保動態代理功能可用
)]
public class MyProjectWebModule : AbpModule
{public override void ConfigureServices(ServiceConfigurationContext context){// … 前面已有 MiniProfiler 注冊代碼 …// 1. 注冊攔截器到依賴注入容器context.Services.AddTransient<MiniProfilerInterceptor>();// 2. 配置動態代理:攔截所有繼承自 ApplicationService 的類方法Configure<AbpDynamicProxyOptions>(options =>{options.Interceptors.Add<MiniProfilerInterceptor>(Predicates.ForService(type =>type.IsAssignableTo<AbpApplicationService>()));});// 如果要攔截 MVC Controller,也可使用:// Configure<AbpAspNetCoreMvcOptions>(options =>// {//     options.ConventionalControllers.Interceptors.AddService<MiniProfilerInterceptor>();// });}
}

? 這樣,所有繼承 ApplicationService 的服務方法都會被 Profiler 自動包裹,無需手動在每個方法中寫 Step

💡 如果只想攔截某個特定命名空間的應用服務,可在 Predicates.ForService(...) 中提供更精準的匹配條件,例如:

Predicates.ForService(type => type.Namespace.Contains("MyProject.Application.Orders"))
AOP 攔截流程圖
是應用服務
否則
應用服務/Controller 方法調用
動態代理攔截
Profiler.Step 包裹調用
直接執行
執行方法體
結束并返回

2?? HttpClient 自動打點

在分布式或微服務場景下,調用第三方 API 也可能成為瓶頸。MiniProfiler 支持在 HttpClient 上自動打點。以下示例展示如何配置帶打點功能的 HttpClient

using Microsoft.Extensions.DependencyInjection;
using StackExchange.Profiling;
using StackExchange.Profiling.Http;// 在 ConfigureServices 中:
services.AddHttpClient("ThirdParty")// 使用 ProfilingHandler 自動捕獲 HttpClient 請求耗時.AddHttpMessageHandler(() => new ProfilingHandler(new HttpClientHandler()));// 在應用服務或 Controller 中注入 IHttpClientFactory:
public class ExternalService : IExternalService
{private readonly IHttpClientFactory _httpClientFactory;public ExternalService(IHttpClientFactory httpClientFactory){_httpClientFactory = httpClientFactory;}public async Task<string> GetExternalDataAsync(){var client = _httpClientFactory.CreateClient("ThirdParty");// 此次請求將被 Profiler 記錄var response = await client.GetAsync("https://api.example.com/data");return await response.Content.ReadAsStringAsync();}
}
HttpClient 打點流程圖
應用發起 HttpClient 請求
ProfilingHandler 攔截
記錄請求開始時間
發送實際 HTTP 請求
記錄響應結束時間
Profiler UI 顯示耗時

3?? 健康檢查接口打點

如果項目有健康檢查(Health Checks)端點,也可以為其打點,幫助監控該接口的執行耗時。

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Diagnostics.HealthChecks;
using StackExchange.Profiling;
using System.Threading.Tasks;[ApiController]
[Route("api/health")]
public class HealthController : ControllerBase
{private readonly HealthCheckService _healthCheckService;public HealthController(HealthCheckService healthCheckService){_healthCheckService = healthCheckService;}[HttpGet]public async Task<HealthReport> CheckAsync(){// 為健康檢查整體邏輯打點using (MiniProfiler.Current?.Step("Health Check")){return await _healthCheckService.CheckHealthAsync();}}
}
健康檢查打點流程圖
客戶端調用 /api/health
MiniProfiler.Step('Health Check')
執行數據庫/Redis/外部接口檢查
返回 HealthReport
Profiler UI 顯示耗時

六、安全與生產建議 🔒

場景建議與示例
生產環境- 禁止啟用 app.UseMiniProfiler(),避免將 SQL、堆棧信息暴露給最終用戶。
- 持久化存儲:使用 options.Storage 將 Profiling 數據保存到數據庫/Redis,然后離線分析。例如:
csharp<br/>options.Storage = new SqlServerStorage(configuration.GetConnectionString("ProfilerDb"), maxStoredResults: 100);<br/>
多用戶區分- 配置 options.UserProvider,讓不同用戶的 Profiling 數據能單獨查看。例如:
csharp<br/>options.UserProvider = request =><br/>{<br/> var user = request.HttpContext.User;<br/> return user?.Identity?.IsAuthenticated == true<br/> ? user.Identity.Name<br/> : "Anonymous";<br/>};<br/>
認證保護- 設置 options.Authorize = request => request.HttpContext.User.IsInRole("PerfAdmin"); 限制只有“PerfAdmin”角色可訪問 /profiler 路由。
- 注意:務必先在管道中調用 app.UseAuthentication()app.UseAuthorization(),否則 HttpContext.User 可能為空。
路由隱藏- 修改默認路由前綴:options.RouteBasePath = "/internal/profiler";
- 在 Nginx/IIS 層做 IP 白名單,僅允許公司內網訪問。例如:
nginx<br/>location /internal/profiler {<br/> allow 192.168.1.0/24;<br/> deny all;<br/> proxy_pass http://localhost:5000/internal/profiler;<br/>}<br/>
跨域場景- 若前后端分離(UI 與 API 跨域),需在 API 項目中配置 CORS 以允許加載 Profiler 腳本。例如:
csharp<br/>services.AddCors(options =><br/>{<br/> options.AddPolicy("AllowProfiler", builder =><br/> {<br/> builder.WithOrigins("http://localhost:5001")<br/> .AllowAnyHeader()<br/> .AllowAnyMethod()<br/> .AllowCredentials();<br/> });<br/>});<br/>app.UseCors("AllowProfiler");<br/>
健康檢查- 如果健康檢查接口需監控耗時,可在 Controller 中添加 using (MiniProfiler.Current?.Step("Health Check")) { … },便于快速定位健康檢查性能瓶頸。

🔒 提示:

  • 在生產環境僅保留“持久化存儲”功能,關閉浮動窗口和即時展示,避免敏感信息泄露。
  • 確保在 Program.csStartup.cs 中先調用 app.UseAuthentication()app.UseAuthorization(),再調用 app.UseMiniProfiler()(開發環境)或 app.UseCors()

七、示例項目與復現方式 🏗?

以下示例倉庫演示了如何在 ABP 項目中完整集成 MiniProfiler,涵蓋開發環境打點、AOP 攔截、HttpClient 打點、持久化存儲、健康檢查打點等功能。

abp-miniprofiler-demo/
├── src/
│   ├── MyProject.Web/                   # Web 層(含 MiniProfiler 注冊、中間件、UI、CORS)
│   ├── MyProject.Application/           # 應用服務層(示例 OrderAppService、ExternalService、HealthController)
│   ├── MyProject.EntityFrameworkCore/   # EF Core 層(DbContext、Migration、配置 ProfilerDb)
│   └── MyProject.Domain/                # 領域層(聚合、實體)
├── profiler-ui.png                      # Profiler UI 截圖示例
├── README.md                            # 快速啟動說明
└── appsettings.json                     # 包含 ProfilerDb、RedisConnection、CORS Origins 等配置

快速啟動步驟

  1. 配置數據庫
    • 打開 appsettings.json,在 "ConnectionStrings" 節點中填入:
     "ConnectionStrings": {"Default": "Server=.;Database=MyProjectDb;Trusted_Connection=True;","ProfilerDb": "Server=.;Database=ProfilerDb;Trusted_Connection=True;","RedisConnection": "localhost:6379"}
  • 如果您使用 SQLite、MySQL 或 PostgreSQL,可在 MyProject.EntityFrameworkCoreDbContext 配置中修改 UseSqlServer 為對應方法,例如 UseSqliteUseMySqlUseNpgsql
  1. 運行數據庫遷移
   dotnet tool install --global dotnet-ef   # 如果尚未安裝dotnet ef migrations add InitialCreate --project src/MyProject.EntityFrameworkCoredotnet ef database update --project src/MyProject.EntityFrameworkCore

如果使用 Redis 存儲 Profiler 數據,請確保本地或容器中已啟動 Redis,例如:

docker run -d --name redis -p 6379:6379 redis
  1. 恢復依賴并運行項目
   dotnet restoredotnet run --project src/MyProject.Web
  1. 訪問應用并查看 Profiler
    • 瀏覽器打開:http://localhost:5000
    • 在頁面右下角會出現 MiniProfiler 浮窗,點擊即可展開 Profiling 詳情,包括:
      • 請求鏈路總耗時
      • EF Core SQL 查詢耗時與詳細信息
      • HttpClient 調用耗時
      • 健康檢查接口耗時
    • 如果配置了持久化存儲,可登錄后臺管理頁面或直接查詢 ProfilerDb 數據庫中的 MiniProfilers 表,離線分析歷史數據。

🔍 線上對比:

  • MiniProfiler 適用于“開發/測試環境”快速定位性能瓶頸。
  • 生產環境若想做全面鏈路追蹤,可結合 Elastic APM、Application Insights 等 APM 平臺。
  • 生產環境僅保留“持久化存儲”功能,關閉浮動窗口和即時展示,避免敏感信息泄露。

? 強烈建議:在所有 ABP 項目中默認集成 MiniProfiler,并按需啟用 AOP 打點與 HttpClient 自動打點,讓性能瓶頸無處藏身!

🔗 更多資源

  • MiniProfiler 官方文檔:https://miniprofiler.com/dotnet/
  • ABP vNext 官方指南:https://docs.abp.io/

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/83005.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/83005.shtml
英文地址,請注明出處:http://en.pswp.cn/web/83005.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ESP32 在Arduino開發環境中,如果程序運行報錯如何定位程序報錯是哪行代碼

在開發中&#xff0c;我們常常會遇到編譯正常&#xff0c;但是運行過程中程序報錯&#xff0c;然后重啟&#xff0c;在這種情況下&#xff0c;又沒法知道是哪段程序引起的&#xff0c;現在我們就來解決這個問題。 其實ESP32的SDK中已經附帶這些debug的工具了。 首先如果我們程…

Python 包管理器 uv 介紹

Python 包管理器 uv 全面介紹 uv 是由 Astral&#xff08;熱門工具 Ruff 的開發者&#xff09;推出的下一代高性能 Python 包管理器和構建工具&#xff0c;用 Rust 編寫。它旨在解決傳統工具&#xff08;如 pip、virtualenv、pip-tools&#xff09;的性能瓶頸&#xff0c;同時…

win10啟動時小鍵盤燈默認不亮怎么辦

第一步&#xff0c;按winR&#xff0c;打開運行。 第二步&#xff0c;輸入regedit&#xff0c;打開注冊表。 第三步&#xff0c;在注冊表編輯器中,依次展開HKEY_ USERS --》.DEFAULT --》Control Panel --》Keyboard &#xff0c; 第四步&#xff0c;選中Keyboard 之后在右側窗…

C盤的“下載”修改位置時出錯了,怎么還原

本來想修改“下載”的位置&#xff0c;結果直接成D盤的快捷鍵了。 正常應該是D盤里面的一個文件夾&#xff0c;而不是D盤。 而且打開D盤&#xff0c;里面的文件夾&#xff0c;全部按照時間分區顯示了&#xff0c;而不是正常的文件顯示。 解決辦法&#xff1a; 1、還原下載路…

量化面試綠皮書:7. 100的階乘中有多少個尾隨零

文中內容僅限技術學習與代碼實踐參考&#xff0c;市場存在不確定性&#xff0c;技術分析需謹慎驗證&#xff0c;不構成任何投資建議。 7. 100的階乘中有多少個尾隨零 Q: 100 ! 100! 100!&#xff08;100 的階乘&#xff09;中有多少個尾隨零&#xff1f; A: 100 ! 100! 100…

Java 常用 API 分類總結(算法競賽考前速記篇)- 適用于算法競賽(如 CCF CSP、藍橋杯、NOI)

以下是Java 常用 API 的系統性總結&#xff0c;特別適用于算法競賽&#xff08;如 CCF CSP、藍橋杯、NOI&#xff09;場景。按照功能分類&#xff0c;并給出代表性方法及簡要用法說明&#xff0c;方便復習與帶入考場&#xff1a; ? Java 常用 API 分類總結&#xff08;算法競賽…

重復文件管理 一鍵清理重復 圖片 文檔 免費 超輕量無廣告

各位電腦小衛士們&#xff01;今天給你們介紹一款超厲害的軟件——ZZYDupFile&#xff0c;它是專門搞重復文件管理的輕量級工具&#xff0c;能幫咱快速找到并清理電腦里的重復文件。接下來我就詳細說說它的那些優點。 軟件下載地址安裝包 首先說說它的核心功能。它查重有好幾…

本地部署企業郵箱,讓企業辦公更安全高效

在當今數字化辦公時代&#xff0c;企業郵箱作為企業溝通協作的重要工具&#xff0c;承載著企業業務往來和辦公協同的重要職能。基于安全性、個性化需求、系統集成等方面的考量&#xff0c;越來越多的企業傾向于選擇本地部署企業郵箱&#xff0c;本地化部署不僅能夠有效守護企業…

基于深度強化學習的智能機器人導航系統

前言 隨著人工智能技術的飛速發展&#xff0c;機器人在日常生活和工業生產中的應用越來越廣泛。其中&#xff0c;機器人導航技術是實現機器人自主移動的關鍵。傳統的導航方法依賴于預設的地圖和路徑規劃算法&#xff0c;但在復雜的動態環境中&#xff0c;這些方法往往難以適應。…

gorm 配置數據庫

介紹 GORM 是 Go 語言中最流行的 ORM&#xff08;對象關系映射&#xff09;庫之一&#xff0c;基于數據庫操作的封裝&#xff0c;提供類似 Django ORM / SQLAlchemy 的開發體驗。 特性描述支持多種數據庫MySQL、PostgreSQL、SQLite、SQL Server、ClickHouse 等自動遷移自動根…

k8s4部署

configMap configmap概述&#xff1a;數據會存儲在etcd數據庫&#xff0c;其應用場景主要在應用程序的配置 configmap支持的類型&#xff08;1&#xff09;鍵值對&#xff08;2&#xff09;多行數據 pod使用configmap資源有兩種常見的方式&#xff08;1&#xff09;變量注入&a…

2025HNCTF - Crypto

Crypto lcgp 題目&#xff1a; from Crypto.Util.number import * import gmpy2 import random n getPrime(1024) flag bH&NCTF{ str(uuid.uuid4()).encode() b} flagbytes_to_long(flag) e 2024 cpow(e, flag, n)class LCG:def __init__(self, seed, a, b, m):sel…

Typeerror: cannot read properties of undefined (reading ‘XXX‘)

最近需要在離線機器上運行軟件&#xff0c;所以得把軟件用docker打包起來&#xff0c;大部分功能都沒問題&#xff0c;出了一個奇怪的事情。同樣的代碼&#xff0c;在本機上用vscode可以運行起來&#xff0c;但是打包之后在docker里出現了問題。使用的是dialog組件&#xff0c;…

前后端分離開發 和 前端工程化

來源&#xff1a;黑馬程序員JavaWeb開發教程&#xff0c;實現javaweb企業開發全流程&#xff08;涵蓋SpringMyBatisSpringMVCSpringBoot等&#xff09;_嗶哩嗶哩_bilibili 前后端混合開發&#xff1a; 需要使用前端的技術棧開發前端的功能&#xff0c;又需要使用Java的技術棧…

QT線程同步 QReadWriteLock并發訪問

QT多線程專欄共有17篇文章,從初識線程到、QMutex鎖、QSemaphore信號量、Emit、Sgnals、Slot主線程子線程互相傳值同步變量、QWaitCondition、QReadWriteLock、事件循環、QObjects、線程安全、線程同步、線程異步、QThreadPool線程池、ObjectThread多線程操作、 moveToThread等…

【物聯網-ModBus-RTU

物聯網-ModBus-RTU ■ 優秀博主鏈接■ ModBus-RTU介紹■&#xff08;1&#xff09;幀結構■&#xff08;2&#xff09;查詢功能碼 0x03■&#xff08;3&#xff09;修改單個寄存器功能碼 0x06■&#xff08;4&#xff09;Modbus RTU 串口收發數據分析 ■ 優秀博主鏈接 Modbus …

03.數據類型

數據類型 數據長什么樣數據需要多少空間來存放系統內置數據類型用戶定義數據類型 選擇正確的數據類型對于獲得高性能至關重要 三大原則: 更小的通常更好&#xff0c;盡量使用可正確存儲數據的最小數據類型簡單就好&#xff0c;簡單數據類型的操作通常需要更少的CPU周期盡量…

達夢數據庫字段類型 varchar 轉 text

達夢數據庫字段類型 varchar 轉 text 業務場景問題浮現問題處理方式一 總結 業務場景 在初次創建達夢數據庫表的時候&#xff0c;僅僅設定了基礎的表字段。然而&#xff0c;在預估字段值的長度時&#xff0c;常常會出現不夠準確的情況。例如&#xff0c;我創建了一張參數配置表…

MyBatis 緩存機制源碼深度解析:一級緩存與二級緩存

MyBatis 緩存機制源碼深度解析&#xff1a;一級緩存與二級緩存 一、一級緩存1.1 邏輯位置與核心源碼解析1.2 一級緩存容器&#xff1a;PerpetualCache1.3 createCacheKey 方法與緩存命中1.4 命中與失效時機1.5 使用方式 二、二級緩存2.1 邏輯位置與核心源碼解析2.2 查詢流程、命…

【題解-Acwing】1097. 池塘計數

題目&#xff1a;1097. 池塘計數 題目描述 農夫約翰有一片 N?M 的矩形土地。 最近&#xff0c;由于降雨的原因&#xff0c;部分土地被水淹沒了。 現在用一個字符矩陣來表示他的土地。 每個單元格內&#xff0c;如果包含雨水&#xff0c;則用”W”表示&#xff0c;如果不含…