using SqlSugar; using Microsoft.Extensions.Configuration; namespace AssetManager.Data; public static class SqlSugarConfig { private static IConfiguration? _configuration; /// /// 初始化配置(在Program.cs中调用) /// public static void Initialize(IConfiguration configuration) { _configuration = configuration; } /// /// 获取 SqlSugarClient 实例(超高性能模式) /// 每次 new 创建实例,IsAutoCloseConnection=true 自动关闭连接 /// 适合:DI Scoped 注入、后台任务、Task.Run 场景 /// public static ISqlSugarClient GetSqlSugarClient() { if (_configuration == null) { throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first."); } var connectionString = GetConnectionString(); // SqlSugarClient 超高性能模式 // 每次创建新实例,IsAutoCloseConnection=true 确保连接自动关闭 return new SqlSugarClient(new ConnectionConfig() { ConnectionString = connectionString, DbType = DbType.MySql, IsAutoCloseConnection = true, // 必须为 true InitKeyType = InitKeyType.Attribute, ConfigureExternalServices = new ConfigureExternalServices { EntityService = (property, column) => { if (property.PropertyType == typeof(DateTime)) { column.DataType = "datetime(3)"; } } } }); } private static string GetConnectionString() { var connectionString = Environment.GetEnvironmentVariable("ConnectionStrings__Default") ?? _configuration!.GetConnectionString("Default") ?? throw new InvalidOperationException("Connection string 'Default' not found in environment variables or configuration."); // MySQL 连接池优化配置 if (!connectionString.Contains("Pooling=", StringComparison.OrdinalIgnoreCase)) { connectionString += ";Pooling=true"; } if (!connectionString.Contains("MaximumPoolSize=", StringComparison.OrdinalIgnoreCase)) { connectionString += ";MaximumPoolSize=100"; } if (!connectionString.Contains("MinimumPoolSize=", StringComparison.OrdinalIgnoreCase)) { connectionString += ";MinimumPoolSize=5"; } if (!connectionString.Contains("ConnectionTimeout=", StringComparison.OrdinalIgnoreCase)) { connectionString += ";ConnectionTimeout=30"; } if (!connectionString.Contains("ConnectionIdleTimeout=", StringComparison.OrdinalIgnoreCase)) { connectionString += ";ConnectionIdleTimeout=180"; } return connectionString; } }