Compare commits

...

2 Commits

Author SHA1 Message Date
OpenClaw Agent
51b7372d81 fix: 优化 MySQL 连接池配置
问题:Cannot Open when State is Connecting

分析:
- SqlSugarScope 是线程安全的,使用 AsyncLocal 隔离上下文
- Singleton 注册符合官方建议
- 问题可能出在 MySQL 连接池配置

修复:
添加连接池参数:
- Pooling=true(开启连接池)
- MaximumPoolSize=100(最大连接数)
- MinimumPoolSize=5(最小连接数)
- ConnectionTimeout=30(连接超时)
- ConnectionIdleTimeout=180(空闲连接超时,避免使用陈旧连接)

配合内存缓存层,减少数据库查询次数
2026-03-24 10:08:35 +00:00
OpenClaw Agent
8d7e62f8af fix: SqlSugar 注册改为 Scoped 避免并发冲突
问题:
- ISqlSugarClient 注册为 Singleton
- 多个请求共享同一个 SqlSugarScope 实例
- Task.WhenAll 并发查询时连接状态冲突

修复:
- Singleton → Scoped
- 每个 HTTP 请求独立的 SqlSugarScope 实例
- 避免跨请求共享连接对象

配合内存缓存层,双重保障:
1. 内存缓存:减少数据库查询次数
2. Scoped:隔离请求间的连接对象
2026-03-24 09:59:30 +00:00
2 changed files with 27 additions and 2 deletions

View File

@ -8,8 +8,8 @@ public static class DatabaseExtensions
{
public static IServiceCollection AddDatabase(this IServiceCollection services)
{
// 使用 Singleton 注册 SqlSugarScope线程安全内部使用 AsyncLocal
// SqlSugarScope 设计上支持并发,会自动管理连接池
// SqlSugarScope 是线程安全的,内部使用 AsyncLocal 隔离上下文
// 使用 Singleton 注册,整个应用共享一个实例
services.AddSingleton<ISqlSugarClient>(s =>
{
return SqlSugarConfig.GetSqlSugarClient();

View File

@ -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,