问题:Cannot Open when State is Connecting 分析: - SqlSugarScope 是线程安全的,使用 AsyncLocal 隔离上下文 - Singleton 注册符合官方建议 - 问题可能出在 MySQL 连接池配置 修复: 添加连接池参数: - Pooling=true(开启连接池) - MaximumPoolSize=100(最大连接数) - MinimumPoolSize=5(最小连接数) - ConnectionTimeout=30(连接超时) - ConnectionIdleTimeout=180(空闲连接超时,避免使用陈旧连接) 配合内存缓存层,减少数据库查询次数
74 lines
2.6 KiB
C#
Executable File
74 lines
2.6 KiB
C#
Executable File
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;
|
||
}
|
||
|
||
public static ISqlSugarClient GetSqlSugarClient()
|
||
{
|
||
if (_configuration == null)
|
||
{
|
||
throw new InvalidOperationException("SqlSugarConfig has not been initialized. Call Initialize() first.");
|
||
}
|
||
|
||
// 优先从环境变量读取连接字符串
|
||
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 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)";
|
||
}
|
||
}
|
||
}
|
||
});
|
||
}
|
||
}
|