ソースを参照

fix(s8): configure datasource endpoint connection pooling

YY968XX 3 日 前
コミット
01c5d2f59b

+ 6 - 3
server/Admin.NET.Web.Entry/Admin.NET.Web.Entry.csproj

@@ -11,9 +11,9 @@
     <GenerateSatelliteAssembliesForCore>true</GenerateSatelliteAssembliesForCore>
     <Copyright>Admin.NET</Copyright>
     <Description>Admin.NET 通用权限开发平台</Description>
-    <AssemblyVersion>1.0.127</AssemblyVersion>
-    <FileVersion>1.0.127</FileVersion>
-    <Version>1.0.127</Version>
+    <AssemblyVersion>1.0.128</AssemblyVersion>
+    <FileVersion>1.0.128</FileVersion>
+    <Version>1.0.128</Version>
   </PropertyGroup>
 
   <ItemGroup>
@@ -76,6 +76,9 @@
     <None Update="UpdateScripts\1.0.125.sql">
       <CopyToOutputDirectory>Always</CopyToOutputDirectory>
     </None>
+    <None Update="UpdateScripts\1.0.128.sql">
+      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
+    </None>
   </ItemGroup>
 
   <ItemGroup>

+ 71 - 0
server/Admin.NET.Web.Entry/UpdateScripts/1.0.128.sql

@@ -0,0 +1,71 @@
+-- 1.0.128.sql
+-- S8-WATCHRULE-DATASOURCE-ENDPOINT-POOLING-1
+-- 给 ado_s8_data_source.id=1 的 endpoint 末尾追加连接池参数,让 S8 watch rule
+-- 旁路的 new SqlSugarScope 连接串显式具备与主库 Database.json 同款的连接池
+-- 治理参数,降低 S8 旁路重连风暴与 MySQL 1129 复发风险。
+--
+-- 阶段 1 审计已确认:
+--   * ado_s8_data_source 全表唯一 1 行(id=1, data_source_code=G01_TEST_DS)
+--   * 当前 endpoint 指向主库:Server=123.60.180.165 / Port=3306 / Database=aidopdev
+--   * 当前 endpoint 不含 Pooling / Maximum Pool Size / Connection LifeTime / Connection Idle Timeout
+--   * 6 条 enabled TIMEOUT watch rule 全部 poll_interval=60s,全部 data_source_id=1
+--   * S8 旁路 evaluator / scheduler 用 ConfigId=Guid.NewGuid():N,不继承 Database.json 连接池参数
+--
+-- 修正范围:
+--   仅给 ado_s8_data_source.id=1 的 endpoint 末尾追加 6 项参数:
+--     Pooling=true; Minimum Pool Size=0; Maximum Pool Size=20;
+--     Connection Timeout=10; Connection Idle Timeout=180; Connection LifeTime=300;
+--
+-- 安全边界:
+--   * 仅 UPDATE 1 行;禁 DELETE/INSERT/DROP/TRUNCATE/ALTER
+--   * WHERE 精确锁定 id=1 + endpoint 主库特征 + 幂等门 (NOT LIKE '%Pooling=%')
+--   * 不改 host / port / database / uid / pwd / SslMode / Charset / AllowLoadLocalInfile / AllowUserVariables
+--   * 不动 ado_s8_watch_rule(不改启停 / poll_interval / data_source_id / rule_type)
+--   * 不动 Database.json
+--   * 不动 S8 旁路 evaluator / scheduler 代码
+--   * ado_s8_data_source 表无 is_deleted 列,WHERE 不写 is_deleted=0
+--
+-- 边界与不能:
+--   * 本脚本不能解封已发生的 MySQL 1129 host block;已发生封禁仍需 DBA FLUSH HOSTS。
+--   * 本脚本不解决 S8 旁路 ConfigId=Guid.NewGuid() 导致的 SqlSugar 层无 scope 复用问题;
+--     该问题由后续独立批次 S8-DYNAMIC-SQLSUGAR-SCOPE-FACTORY-1 治理。
+--   * 本脚本不承诺旁路 endpoint 与 Database.json 连接串字节级一致,也不承诺与主库共享
+--     同一个 MySqlConnector 物理池;只承诺旁路 endpoint 显式具备同样的连接池治理参数。
+--
+-- 幂等性:
+--   * NOT LIKE '%Pooling=%' 保证二次执行 0 affected rows
+--   * AutoVersionUpdate 按版本号决定是否跑,1.0.128 执行一次即完成
+--
+-- 字段长度安全:
+--   * endpoint 字段类型 varchar(1024)
+--   * 当前 endpoint 长度约 116
+--   * 追加约 120 字符后约 236,远小于 1024
+--
+-- 兼容性:
+--   * 仅使用 UPDATE / CASE WHEN / CONCAT / LIKE / NOT LIKE,MySQL 5.7+ / 8.x 通用
+--
+-- 阶段 4 验证(重演后必查):
+--   SELECT id, LENGTH(endpoint),
+--          endpoint LIKE '%Pooling=true%'              AS has_pooling,
+--          endpoint LIKE '%Maximum Pool Size=20%'      AS has_maxpool,
+--          endpoint LIKE '%Connection LifeTime=300%'   AS has_lifetime
+--     FROM ado_s8_data_source WHERE id=1;
+--   → has_pooling=1, has_maxpool=1, has_lifetime=1, LENGTH ≈ 236
+-- 2026-05-26
+
+
+UPDATE `ado_s8_data_source`
+   SET `endpoint` = CONCAT(
+         CASE WHEN `endpoint` LIKE '%;' THEN `endpoint`
+              ELSE CONCAT(`endpoint`, ';') END,
+         'Pooling=true;',
+         'Minimum Pool Size=0;',
+         'Maximum Pool Size=20;',
+         'Connection Timeout=10;',
+         'Connection Idle Timeout=180;',
+         'Connection LifeTime=300;'
+       )
+ WHERE `id` = 1
+   AND `endpoint` LIKE '%Server=123.60.180.165%'
+   AND `endpoint` LIKE '%Database=aidopdev%'
+   AND `endpoint` NOT LIKE '%Pooling=%';