diff --git a/AssetManager.Data/DatabaseExtensions.cs b/AssetManager.Data/DatabaseExtensions.cs index e7e9784..3a0cf3c 100755 --- a/AssetManager.Data/DatabaseExtensions.cs +++ b/AssetManager.Data/DatabaseExtensions.cs @@ -8,9 +8,9 @@ public static class DatabaseExtensions { public static IServiceCollection AddDatabase(this IServiceCollection services) { - // 使用 Scoped 注册,每个 HTTP 请求一个实例,避免并发冲突 - // SqlSugarScope 内部会自动管理连接池 - services.AddScoped(s => + // SqlSugarScope 是线程安全的,内部使用 AsyncLocal 隔离上下文 + // 使用 Singleton 注册,整个应用共享一个实例 + services.AddSingleton(s => { return SqlSugarConfig.GetSqlSugarClient(); }); diff --git a/AssetManager.Data/SqlSugarConfig.cs b/AssetManager.Data/SqlSugarConfig.cs index 55244c1..319c56e 100755 --- a/AssetManager.Data/SqlSugarConfig.cs +++ b/AssetManager.Data/SqlSugarConfig.cs @@ -27,6 +27,31 @@ public static class SqlSugarConfig ?? _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 new SqlSugarScope(new ConnectionConfig() { ConnectionString = connectionString,