AssetManager.API/AssetManager.Data/SqlSugarConfig.cs
OpenClaw Agent dc50dfc917 fix: 区分 SqlSugarScope 和 SqlSugarClient 使用场景
区分:
- GetSqlSugarScope(): 返回 SqlSugarScope,用于 DI 注入(Singleton)
- GetSqlSugarClient(): 返回 SqlSugarClient,用于后台任务(每次创建新实例)

原因:
- SqlSugarScope 使用 AsyncLocal 隔离上下文
- Task.Run 后台线程中 AsyncLocal 可能无法正确传递
- 后台任务使用 SqlSugarClient 更安全,每个实例独立连接

使用:
- DI 注入:GetSqlSugarScope()
- Repository 后台写入:GetSqlSugarClient()
- MySQL 连接池复用底层 TCP 连接,性能开销小
2026-03-25 02:42:26 +00:00

113 lines
3.8 KiB
C#
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

using SqlSugar;
using Microsoft.Extensions.Configuration;
namespace AssetManager.Data;
public static class SqlSugarConfig
{
private static IConfiguration? _configuration;
/// <summary>
/// 初始化配置在Program.cs中调用
/// </summary>
public static void Initialize(IConfiguration configuration)
{
_configuration = configuration;
}
/// <summary>
/// 获取 SqlSugarClient 实例(用于后台任务,每次创建新实例)
/// </summary>
public static ISqlSugarClient GetSqlSugarClient()
{
if (_configuration == null)
{
throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first.");
}
var connectionString = GetConnectionString();
// 使用 SqlSugarClient非 Scope每次创建独立实例
// 适合后台任务、Task.Run 场景
return new SqlSugarClient(new ConnectionConfig()
{
ConnectionString = connectionString,
DbType = DbType.MySql,
IsAutoCloseConnection = true,
InitKeyType = InitKeyType.Attribute,
ConfigureExternalServices = new ConfigureExternalServices
{
EntityService = (property, column) =>
{
if (property.PropertyType == typeof(DateTime))
{
column.DataType = "datetime(3)";
}
}
}
});
}
/// <summary>
/// 获取 SqlSugarScope 实例(用于 DI 注入Singleton/Scoped
/// </summary>
public static ISqlSugarClient GetSqlSugarScope()
{
if (_configuration == null)
{
throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first.");
}
var connectionString = GetConnectionString();
return new SqlSugarScope(new ConnectionConfig()
{
ConnectionString = connectionString,
DbType = DbType.MySql,
IsAutoCloseConnection = 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;
}
}