refactor: 统一使用 SqlSugarClient(官方推荐高性能模式)

官方建议:
- SqlSugarClient 超高性能模式
- 每次 new 创建实例
- IsAutoCloseConnection=true 自动关闭连接
- 适合 DI Scoped 注入、后台任务、Task.Run 场景

修改:
1. DI 注入改为 Scoped(每次 HTTP 请求一个实例)
2. 移除 SqlSugarScope,统一使用 SqlSugarClient
3. 后台任务创建新实例(已实现)
4. MySQL 连接池复用底层 TCP 连接

优点:
- 性能更好
- 代码更简单
- 符合官方最佳实践
This commit is contained in:
OpenClaw Agent 2026-03-25 02:47:00 +00:00
parent dc50dfc917
commit 650d59aaff
2 changed files with 10 additions and 39 deletions

View File

@ -8,11 +8,11 @@ public static class DatabaseExtensions
{
public static IServiceCollection AddDatabase(this IServiceCollection services)
{
// SqlSugarScope 是线程安全的,内部使用 AsyncLocal 隔离上下文
// 使用 Singleton 注册,整个应用共享一个实例
services.AddSingleton<ISqlSugarClient>(s =>
// SqlSugarClient 超高性能模式:每次请求创建新实例
// Scoped 确保:同一 HTTP 请求内复用,不同请求隔离
services.AddScoped<ISqlSugarClient>(s =>
{
return SqlSugarConfig.GetSqlSugarScope();
return SqlSugarConfig.GetSqlSugarClient();
});
services.AddScoped<DatabaseService>();

View File

@ -16,7 +16,9 @@ public static class SqlSugarConfig
}
/// <summary>
/// 获取 SqlSugarClient 实例(用于后台任务,每次创建新实例)
/// 获取 SqlSugarClient 实例(超高性能模式)
/// 每次 new 创建实例IsAutoCloseConnection=true 自动关闭连接
/// 适合DI Scoped 注入、后台任务、Task.Run 场景
/// </summary>
public static ISqlSugarClient GetSqlSugarClient()
{
@ -27,44 +29,13 @@ public static class SqlSugarConfig
var connectionString = GetConnectionString();
// 使用 SqlSugarClient非 Scope每次创建独立实例
// 适合后台任务、Task.Run 场景
// SqlSugarClient 超高性能模式
// 每次创建新实例IsAutoCloseConnection=true 确保连接自动关闭
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,
IsAutoCloseConnection = true, // 必须为 true
InitKeyType = InitKeyType.Attribute,
ConfigureExternalServices = new ConfigureExternalServices
{