惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

P
Privacy International News Feed
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
W
WeLiveSecurity
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Google DeepMind News
Google DeepMind News
Hacker News - Newest:
Hacker News - Newest: "LLM"
Google Online Security Blog
Google Online Security Blog
N
News and Events Feed by Topic
TaoSecurity Blog
TaoSecurity Blog
云风的 BLOG
云风的 BLOG
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
Recent Announcements
Recent Announcements
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
L
LangChain Blog
The GitHub Blog
The GitHub Blog
aimingoo的专栏
aimingoo的专栏
Scott Helme
Scott Helme
腾讯CDC
T
Threat Research - Cisco Blogs
P
Palo Alto Networks Blog
Cloudbric
Cloudbric
K
Kaspersky official blog
B
Blog RSS Feed
博客园_首页
MongoDB | Blog
MongoDB | Blog
Stack Overflow Blog
Stack Overflow Blog
G
Google Developers Blog
Jina AI
Jina AI
Hugging Face - Blog
Hugging Face - Blog
Vercel News
Vercel News
The Last Watchdog
The Last Watchdog
S
Schneier on Security
T
Tor Project blog
雷峰网
雷峰网
博客园 - 司徒正美
H
Hacker News: Front Page
I
Intezer
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
Martin Fowler
Martin Fowler
Y
Y Combinator Blog
T
The Blog of Author Tim Ferriss
Help Net Security
Help Net Security
WordPress大学
WordPress大学
T
The Exploit Database - CXSecurity.com
H
Hackread – Cybersecurity News, Data Breaches, AI and More
量子位
V
Vulnerabilities – Threatpost
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
T
Threatpost

博客园 - 我才是银古

第16章:常见问题、排错与最佳实践 第15章:扩展生态、MCAD 与外部集成 第12章:实战案例:机械结构与 3D 打印零件 第14章:构建、测试、调试与贡献流程 第13章:OpenSCAD 源码架构与核心执行流程 第11章:预览、渲染、网格精度与性能优化 第09章:列表推导、递归与算法建模 第08章:参数化零件库与复用设计 第10章:导入导出、命令行与自动化 第06章:CSG 布尔建模方法 第07章:二维图形、拉伸、旋转与投影 第05章:基础几何、坐标系与变换 第04章:参数、变量、函数、模块与作用域 OpenSCAD 教程目录 第03章:OpenSCAD 语言基础 第02章:安装、环境配置与开发工作流 第01章:OpenSCAD 项目全景与学习路线 第02章:源码获取、编译与开发环境配置 第01章:OCCT项目全景与学习路线 第18章:二次开发实战与综合案例 第18章:综合实战案例 第17章:数据交换与协同 第16章:源码架构与二次开发 第15章:插件与自定义工作台开发 第14章:Python脚本宏与自动化 第13章:FEM仿真分析 第12章:CAM数控加工 第11章:SurfaceMesh与逆向工程 第10章:Draft二维绘图与BIM建筑 第09章:工程图TechDraw 第07章:参数化表达式与Spreadsheet 第08章:装配设计Assembly 第06章:Part工作台与几何内核 第05章:PartDesign实体特征建模 第04章:草图Sketcher约束建模 第02章:安装版本与工作环境配置 第03章:界面工作台与基础操作 第01章:项目全景与学习路线 第十二章:插件开发、研究功能与最佳实践 第十章:定时任务与自动化(Cron) 第七章:技能、记忆与自学习闭环 第八章:MCP 集成与上下文文件 第六章:工具系统与终端后端 第五章:模型供应商与配置体系 Hermes Agent 教程目录 第十一章:语音、视觉、浏览器与子代理协作 第四章:CLI/TUI 与会话管理 第十二章:学习路线、实战方案与最佳实践 第十一章:源码结构、开发调试与插件开发 第十章:自动化、远程访问、日志与排障 第九章:Control UI、节点、Canvas 与语音能力 第七章:工具、技能、插件与能力扩展 第八章:安全模型、访问控制与沙箱实践 第六章:Agent 工作区、会话与多智能体路由 第五章:多通道消息接入与聊天平台配置 第四章:配置体系、模型接入与认证管理 第三章:Gateway 架构、协议与运行机制 第二章:安装、环境准备与快速上手 第一章:OpenClaw 项目概览与核心定位 oh-my-openagent 教程目录 09-命令模型回退与配置参考 10-实战案例最佳实践与故障排除 05-工作模式-Ultrawork-Prometheus-Atlas 08-Hooks与MCP系统 06-Category与Skill系统 07-核心工具链 04-智能体全景详解 03-安装与环境配置 02-整体架构与多模型编排机制 01-项目简介与核心理念 01-项目概览与学习路线 02-安装部署与工具适配 03-Skill机制与using-superpowers 05-TDD系统化调试与完成前验证 04-需求澄清方案设计与计划编写 07-并行智能体子智能体与Git-Worktree 第六章:代码审查、反馈处理与分支收尾 08-中国特色Skills与本土团队落地 09-MCP构建工作流执行与自定义Skill 第23章:FreeCAD-Python-API Clipper2 C# 源码解读教程 第19章:PolyTree 多边形树结构 第20章:实际应用与最佳实践 第18章:Minkowski 和与差 第17章:RectClip 矩形裁剪优化 第16章:ClipperOffset 偏移类详解 第15章:填充规则详解 第14章:布尔运算执行流程 第13章:ClipperD 浮点裁剪类 第11章:OutRec 与 OutPt 输出结构 第9章:Active 活动边结构 第10章:Vertex 顶点与 LocalMinima 局部极小值 第12章:Clipper64 裁剪类详解 第7章:高精度运算与128位整数 第8章:ClipperBase 基类详解 第5章:枚举类型与常量定义 第6章:InternalClipper 内部工具类 第2章:核心数据结构 - Point64、PointD 第3章:路径与多边形表示 - Path64、PathD、Paths64、PathsD 第4章:矩形边界 - Rect64、RectD
第三章:数据库连接与配置
我才是银古 · 2026-06-21 · via 博客园 - 我才是银古

第三章:数据库连接与配置

目录

3.1 ConnectionConfig详解

3.1.1 基本配置项

ConnectionConfig是SqlSugar的核心配置类,包含了所有数据库连接相关的配置项。以下是一个完整的配置示例:

var config = new ConnectionConfig()
{
    ConnectionString = "Server=localhost;Database=TestDB;Uid=root;Pwd=123456;",
    DbType = DbType.MySql,
    IsAutoCloseConnection = true,
    InitKeyType = InitKeyType.Attribute,
    ConfigureExternalServices = new ConfigureExternalServices()
    {
        // 序列化服务
        SerializeService = new SerializeService(),
        // 实体服务
        EntityService = new EntityService(),
        // 实体命名服务
        EntityNameService = (type, entity) => { }
    }
};

var db = new SqlSugarClient(config);

关键配置项说明:

  • ConnectionString: 数据库连接字符串
  • DbType: 数据库类型(MySQL, SqlServer, PostgreSQL等)
  • IsAutoCloseConnection: 是否自动关闭连接,建议设为true
  • InitKeyType: 主键初始化方式(Attribute或SystemTable)

3.1.2 数据库类型

SqlSugar支持多种数据库类型:

// SQL Server
DbType = DbType.SqlServer

// MySQL
DbType = DbType.MySql

// PostgreSQL
DbType = DbType.PostgreSQL

// Oracle
DbType = DbType.Oracle

// SQLite
DbType = DbType.Sqlite

// 达梦数据库
DbType = DbType.Dm

// 人大金仓
DbType = DbType.Kdbndp

3.1.3 连接字符串

不同数据库的连接字符串格式:

// SQL Server
"Server=localhost;Database=TestDB;User Id=sa;Password=123456;TrustServerCertificate=true;"

// MySQL
"Server=localhost;Database=TestDB;Uid=root;Pwd=123456;CharSet=utf8mb4;"

// PostgreSQL
"Host=localhost;Port=5432;Database=TestDB;Username=postgres;Password=123456;"

// SQLite
"Data Source=C:\\TestDB.db;Version=3;"

// Oracle
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=localhost)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=ORCL)));User Id=system;Password=123456;"

3.2 连接池管理

3.2.1 连接池原理

连接池是一种创建和管理数据库连接缓存的技术,可以避免频繁创建和销毁连接带来的性能开销。

// SqlSugar默认使用ADO.NET的连接池机制
var config = new ConnectionConfig()
{
    ConnectionString = "Server=localhost;Database=TestDB;Uid=root;Pwd=123456;Pooling=true;Min Pool Size=5;Max Pool Size=100;",
    DbType = DbType.MySql,
    IsAutoCloseConnection = true
};

3.2.2 连接池配置

通过连接字符串配置连接池参数:

var connectionString = new StringBuilder()
    .Append("Server=localhost;")
    .Append("Database=TestDB;")
    .Append("Uid=root;")
    .Append("Pwd=123456;")
    .Append("Pooling=true;")              // 启用连接池
    .Append("Min Pool Size=5;")           // 最小连接数
    .Append("Max Pool Size=100;")         // 最大连接数
    .Append("Connection Lifetime=300;")   // 连接生命周期(秒)
    .Append("Connection Timeout=30;")     // 连接超时时间(秒)
    .ToString();

var config = new ConnectionConfig()
{
    ConnectionString = connectionString,
    DbType = DbType.MySql,
    IsAutoCloseConnection = true
};

3.2.3 连接池监控

监控连接池状态:

public class ConnectionPoolMonitor
{
    private readonly SqlSugarClient _db;

    public ConnectionPoolMonitor(SqlSugarClient db)
    {
        _db = db;
    }

    public void MonitorConnection()
    {
        // 监控SQL执行
        _db.Aop.OnLogExecuting = (sql, pars) =>
        {
            Console.WriteLine($"执行时间: {DateTime.Now}");
            Console.WriteLine($"SQL: {sql}");
        };

        // 监控SQL执行完成
        _db.Aop.OnLogExecuted = (sql, pars) =>
        {
            Console.WriteLine($"执行完成: {DateTime.Now}");
        };

        // 监控错误
        _db.Aop.OnError = (exp) =>
        {
            Console.WriteLine($"错误信息: {exp.Message}");
        };
    }
}

3.3 多数据库连接

3.3.1 多库配置

配置多个数据库连接:

var configList = new List<ConnectionConfig>()
{
    new ConnectionConfig()
    {
        ConfigId = "db1",
        ConnectionString = "Server=localhost;Database=DB1;Uid=root;Pwd=123456;",
        DbType = DbType.MySql,
        IsAutoCloseConnection = true
    },
    new ConnectionConfig()
    {
        ConfigId = "db2",
        ConnectionString = "Server=localhost;Database=DB2;Uid=root;Pwd=123456;",
        DbType = DbType.MySql,
        IsAutoCloseConnection = true
    }
};

var db = new SqlSugarScope(configList);

// 使用不同的数据库
var db1 = db.GetConnection("db1");
var db2 = db.GetConnection("db2");

// 在db1中查询
var users1 = db1.Queryable<User>().ToList();

// 在db2中查询
var users2 = db2.Queryable<User>().ToList();

3.3.2 动态切换数据库

根据条件动态切换数据库:

public class DatabaseSelector
{
    private readonly SqlSugarScope _db;

    public DatabaseSelector(SqlSugarScope db)
    {
        _db = db;
    }

    public SqlSugarClient GetDatabase(string tenantId)
    {
        // 根据租户ID选择数据库
        var configId = $"tenant_{tenantId}";
        return _db.GetConnection(configId);
    }

    public List<User> GetUsersByTenant(string tenantId)
    {
        var db = GetDatabase(tenantId);
        return db.Queryable<User>().ToList();
    }
}

3.3.3 主从数据库

配置主从数据库实现读写分离:

var configList = new List<ConnectionConfig>()
{
    new ConnectionConfig()
    {
        ConfigId = "master",
        ConnectionString = "Server=master.db;Database=TestDB;Uid=root;Pwd=123456;",
        DbType = DbType.MySql,
        IsAutoCloseConnection = true
    },
    new ConnectionConfig()
    {
        ConfigId = "slave1",
        ConnectionString = "Server=slave1.db;Database=TestDB;Uid=root;Pwd=123456;",
        DbType = DbType.MySql,
        IsAutoCloseConnection = true
    },
    new ConnectionConfig()
    {
        ConfigId = "slave2",
        ConnectionString = "Server=slave2.db;Database=TestDB;Uid=root;Pwd=123456;",
        DbType = DbType.MySql,
        IsAutoCloseConnection = true
    }
};

var db = new SqlSugarScope(configList);

public class MasterSlaveRepository
{
    private readonly SqlSugarScope _db;
    private readonly Random _random = new Random();

    public MasterSlaveRepository(SqlSugarScope db)
    {
        _db = db;
    }

    // 写操作使用主库
    public bool Insert(User user)
    {
        var master = _db.GetConnection("master");
        return master.Insertable(user).ExecuteCommand() > 0;
    }

    // 读操作使用从库
    public List<User> Query()
    {
        var slaveId = _random.Next(1, 3); // 随机选择从库
        var slave = _db.GetConnection($"slave{slaveId}");
        return slave.Queryable<User>().ToList();
    }
}

3.4 连接字符串构建器

使用构建器模式创建连接字符串:

public class ConnectionStringBuilder
{
    private string _server;
    private string _database;
    private string _userId;
    private string _password;
    private int _port;
    private string _charset = "utf8mb4";
    private bool _pooling = true;
    private int _minPoolSize = 5;
    private int _maxPoolSize = 100;

    public ConnectionStringBuilder WithServer(string server)
    {
        _server = server;
        return this;
    }

    public ConnectionStringBuilder WithDatabase(string database)
    {
        _database = database;
        return this;
    }

    public ConnectionStringBuilder WithCredentials(string userId, string password)
    {
        _userId = userId;
        _password = password;
        return this;
    }

    public ConnectionStringBuilder WithPooling(int minSize = 5, int maxSize = 100)
    {
        _pooling = true;
        _minPoolSize = minSize;
        _maxPoolSize = maxSize;
        return this;
    }

    public string Build()
    {
        return $"Server={_server};Database={_database};Uid={_userId};Pwd={_password};" +
               $"CharSet={_charset};Pooling={_pooling};Min Pool Size={_minPoolSize};" +
               $"Max Pool Size={_maxPoolSize};";
    }
}

// 使用示例
var connectionString = new ConnectionStringBuilder()
    .WithServer("localhost")
    .WithDatabase("TestDB")
    .WithCredentials("root", "123456")
    .WithPooling(10, 200)
    .Build();

3.5 连接生命周期管理

正确管理连接的生命周期:

public class ConnectionLifecycleManager
{
    // 方式1: 使用IsAutoCloseConnection
    public void AutoCloseExample()
    {
        var config = new ConnectionConfig()
        {
            ConnectionString = "...",
            DbType = DbType.MySql,
            IsAutoCloseConnection = true  // 自动关闭
        };
        
        var db = new SqlSugarClient(config);
        var users = db.Queryable<User>().ToList();
        // 连接自动关闭,无需手动处理
    }

    // 方式2: 手动管理连接
    public void ManualCloseExample()
    {
        var config = new ConnectionConfig()
        {
            ConnectionString = "...",
            DbType = DbType.MySql,
            IsAutoCloseConnection = false
        };
        
        var db = new SqlSugarClient(config);
        try
        {
            db.Open(); // 手动打开
            var users = db.Queryable<User>().ToList();
        }
        finally
        {
            db.Close(); // 手动关闭
        }
    }

    // 方式3: 使用SqlSugarScope(推荐用于依赖注入)
    public void ScopeExample()
    {
        var config = new ConnectionConfig()
        {
            ConnectionString = "...",
            DbType = DbType.MySql,
            IsAutoCloseConnection = true
        };
        
        var db = new SqlSugarScope(config);
        // SqlSugarScope会自动管理连接生命周期
        var users = db.Queryable<User>().ToList();
    }
}

3.6 连接安全性

保护数据库连接的安全性:

public class SecureConnectionManager
{
    // 1. 加密连接字符串
    public string EncryptConnectionString(string connectionString)
    {
        // 使用加密算法加密连接字符串
        var bytes = Encoding.UTF8.GetBytes(connectionString);
        var encrypted = Convert.ToBase64String(bytes);
        return encrypted;
    }

    // 2. 从配置文件读取加密的连接字符串
    public SqlSugarClient GetSecureClient()
    {
        var encryptedConnectionString = ConfigurationManager.AppSettings["EncryptedConnection"];
        var connectionString = DecryptConnectionString(encryptedConnectionString);

        var config = new ConnectionConfig()
        {
            ConnectionString = connectionString,
            DbType = DbType.MySql,
            IsAutoCloseConnection = true
        };

        return new SqlSugarClient(config);
    }

    private string DecryptConnectionString(string encrypted)
    {
        var bytes = Convert.FromBase64String(encrypted);
        return Encoding.UTF8.GetString(bytes);
    }

    // 3. 使用SSL连接
    public ConnectionConfig GetSSLConfig()
    {
        return new ConnectionConfig()
        {
            ConnectionString = "Server=localhost;Database=TestDB;Uid=root;Pwd=123456;SslMode=Required;",
            DbType = DbType.MySql,
            IsAutoCloseConnection = true
        };
    }

    // 4. 限制连接权限
    public void ConfigureWithLeastPrivilege()
    {
        // 为不同操作使用不同的数据库用户
        var readOnlyConfig = new ConnectionConfig()
        {
            ConfigId = "readonly",
            ConnectionString = "Server=localhost;Database=TestDB;Uid=reader;Pwd=123456;",
            DbType = DbType.MySql,
            IsAutoCloseConnection = true
        };

        var readWriteConfig = new ConnectionConfig()
        {
            ConfigId = "readwrite",
            ConnectionString = "Server=localhost;Database=TestDB;Uid=writer;Pwd=123456;",
            DbType = DbType.MySql,
            IsAutoCloseConnection = true
        };
    }
}

3.7 连接监控与诊断

监控和诊断数据库连接:

public class ConnectionDiagnostics
{
    private readonly SqlSugarClient _db;

    public ConnectionDiagnostics(SqlSugarClient db)
    {
        _db = db;
        ConfigureAop();
    }

    private void ConfigureAop()
    {
        // SQL执行前
        _db.Aop.OnLogExecuting = (sql, pars) =>
        {
            Console.WriteLine($"【执行SQL】{DateTime.Now}");
            Console.WriteLine($"SQL: {sql}");
            Console.WriteLine($"参数: {GetParams(pars)}");
        };

        // SQL执行后
        _db.Aop.OnLogExecuted = (sql, pars) =>
        {
            Console.WriteLine($"【执行完成】{DateTime.Now}");
        };

        // 执行错误
        _db.Aop.OnError = (exp) =>
        {
            Console.WriteLine($"【执行错误】{exp.Message}");
            Console.WriteLine($"堆栈: {exp.StackTrace}");
        };

        // 差异日志(用于数据审计)
        _db.Aop.OnDiffLogEvent = (diffLog) =>
        {
            Console.WriteLine($"【数据变更】表:{diffLog.TableName}");
            Console.WriteLine($"操作类型: {diffLog.DiffType}");
            Console.WriteLine($"变更前: {diffLog.BeforeData}");
            Console.WriteLine($"变更后: {diffLog.AfterData}");
        };
    }

    private string GetParams(SugarParameter[] pars)
    {
        if (pars == null || pars.Length == 0) return "无参数";
        return string.Join(", ", pars.Select(p => $"{p.ParameterName}={p.Value}"));
    }

    // 性能监控
    public void MonitorPerformance()
    {
        var stopwatch = new Stopwatch();
        
        _db.Aop.OnLogExecuting = (sql, pars) =>
        {
            stopwatch.Restart();
        };

        _db.Aop.OnLogExecuted = (sql, pars) =>
        {
            stopwatch.Stop();
            if (stopwatch.ElapsedMilliseconds > 1000) // 慢查询
            {
                Console.WriteLine($"【慢查询警告】耗时:{stopwatch.ElapsedMilliseconds}ms");
                Console.WriteLine($"SQL: {sql}");
            }
        };
    }

    // 连接测试
    public bool TestConnection()
    {
        try
        {
            return _db.Ado.GetInt("SELECT 1") == 1;
        }
        catch (Exception ex)
        {
            Console.WriteLine($"连接测试失败: {ex.Message}");
            return false;
        }
    }
}

3.8 最佳实践

连接配置最佳实践

public class ConnectionBestPractices
{
    // 1. 使用SqlSugarScope进行依赖注入
    public static void ConfigureServices(IServiceCollection services)
    {
        services.AddScoped<ISqlSugarClient>(provider =>
        {
            var config = new ConnectionConfig()
            {
                ConnectionString = "...",
                DbType = DbType.MySql,
                IsAutoCloseConnection = true,
                InitKeyType = InitKeyType.Attribute
            };

            var db = new SqlSugarScope(config);
            
            // 配置AOP
            db.Aop.OnLogExecuting = (sql, pars) =>
            {
                // 记录SQL日志
            };

            return db;
        });
    }

    // 2. 环境分离配置
    public static ConnectionConfig GetConfigByEnvironment(string env)
    {
        return env switch
        {
            "Development" => new ConnectionConfig()
            {
                ConnectionString = "Server=localhost;Database=TestDB_Dev;...",
                DbType = DbType.MySql,
                IsAutoCloseConnection = true
            },
            "Production" => new ConnectionConfig()
            {
                ConnectionString = "Server=prod.server;Database=TestDB;...",
                DbType = DbType.MySql,
                IsAutoCloseConnection = true
            },
            _ => throw new ArgumentException("未知环境")
        };
    }

    // 3. 连接重试机制
    public static SqlSugarClient CreateClientWithRetry(ConnectionConfig config, int maxRetries = 3)
    {
        for (int i = 0; i < maxRetries; i++)
        {
            try
            {
                var db = new SqlSugarClient(config);
                if (db.Ado.GetInt("SELECT 1") == 1)
                {
                    return db;
                }
            }
            catch (Exception ex)
            {
                if (i == maxRetries - 1) throw;
                Thread.Sleep(1000 * (i + 1)); // 递增等待时间
            }
        }
        throw new Exception("无法创建数据库连接");
    }
}

常见陷阱

  1. 忘记设置IsAutoCloseConnection: 可能导致连接泄漏
  2. 硬编码连接字符串: 安全风险,应使用配置文件
  3. 不配置连接池: 性能不佳
  4. 混用SqlSugarClient和SqlSugarScope: 可能导致连接管理混乱
  5. 忽略异常处理: 连接失败时没有适当的错误处理

本章小结

本章详细介绍了SqlSugar的数据库连接与配置,包括:

  1. ConnectionConfig配置: 掌握了各种配置项的使用方法
  2. 连接池管理: 学习了如何优化连接池以提升性能
  3. 多数据库连接: 了解了多库配置和主从分离的实现
  4. 连接安全: 掌握了保护数据库连接的各种方法
  5. 监控诊断: 学会了如何监控和诊断连接问题
  6. 最佳实践: 总结了连接管理的最佳实践和常见陷阱

通过本章的学习,你应该能够熟练配置和管理SqlSugar的数据库连接,为后续的开发工作打下坚实基础。

下一章: 第04章-实体类与CodeFirst