官网地址:SqlSugar ORM 5.X 官网 、文档、教程 - SqlSugar 5x - .NET果糖网https://www.donet5.com/Home/Dochttps://www.donet5.com/Home/Doc

面向对象的操作数据库,相比EFCore、Dapper等其他ORM框架性能支持性能轻便快捷,

数据库的读写分离能大大减轻数据库的压力

一、NuGet下载安装 SqlSugarCore

二、实例化SqlSugarCore---包含数据库链接---指定数据库类型---增删改查,上代码

这里演示使用控制台程序

using SqlSugar;

//实例化数据库链接
var db = new SqlSugarClient(new ConnectionConfig()
{
    DbType = DbType.SqlServer,//指定数据库类型
    ConnectionString = "server=.;Database=TESTDB;Uid=sa;Pwd=198;",//数据库链接字符串
    IsAutoCloseConnection = true,//链接使用完后是否自动释放
    InitKeyType = InitKeyType.Attribute//从实体特性中读取主键自增列信息
});

//相应的增删改查(Test是对应数据库表的实体类)
//向指定表添加一行数据
db.Insertable<Test>(new Test()
{
    UserId = "zhangsan",
    Name = "张三",
    Phone = "123456",

}).ExecuteCommand();

//获取列表数据
List<Test> list = db.Queryable<Test>().ToList();

//获取首行数据
Test t = db.Queryable<Test>().First();

//更新数据
t.Name = "张三丰";
db.Updateable<Test>(t).ExecuteCommand();

//删除数据
db.Deleteable<Test>(t).ExecuteCommand();

三、SqlSugar-支持数据库主从复制、这里使用的是SqlServer2008R2

1、开始之前先创建一个指定的文件夹,确保该文件夹为共享

2、配置分发

选中“复制”--右键--配置分发

点击下一步 

 

选中“******”将充当自己的分发服务器 ;SQL Server将创建分发数据库和日志,点击下一步

 

 选中-是,将SQL Server代理服务配置为自动启动,点击下一步

 将开始创建的共享文件夹的路径输入文本框、点击下一步

 

 后面一直下一步到完成即可

3、 本地分发

右键-新建发布

 选中你要发布的数据库(主库),点击下一步

 选中事务发布,点击下一步

 选中所有表,点击下一步 

 

 不筛选表行,点击下一步

 选中立即创建快照并使快照保持可用状态,以初始化订阅,点击下一步

 

 代理安全性,点击安全设置

 

 我们这里发布和订阅都是使用本地数据库,所以选中在SQLServer代理服务账户下运行

连接到发布服务器使用以下SQLServer登录名,如下图,填写好本地账户账号密码,点击确定

创建发布、下一步 

 

填写好发布名称,点击完成 

 

创建成功 

 

 这时可以在最开始选中的文件夹内看到多出了这个文件夹,代表创建成功了

 4、本地订阅-邮件新建订阅

选中之前发布的代理,点击下一步

 分发代理位置选择在发布服务器****上运行所有代理。。。。。点击下一步

 

选择新建数据库,新建就不做阐述 

 

 点击如下图 ...  进入配置

 

 选中在SQL Server代理服务账户下运行,使用SQL Server登录名,点击确定

下一步 

 

 剩下的一直点击下一步,直到创建完成

 这时可以去数据库列表可以看见多出了自己刚才创建的数据库(从库,包含数据)

5、我们可以多创建几个订阅数据库,这是对主库(TESTDB)进行增删改查会发现会直接影响SQLSugarDB_001.002.003(次库),实现数据同步

四、数据库读写分离

1、链接字符串

using SqlSugar;

//实例化数据库链接
var db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "server=.;Database=TESTDB;Uid=sa;Pwd=198;",//数据库链接字符串
    DbType = DbType.SqlServer,//指定数据库类型
    IsAutoCloseConnection = true,//链接使用完后是否自动释放
    InitKeyType = InitKeyType.Attribute,//从实体特性中读取主键自增列信息
    //从库链接
    SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
        new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_001;Uid=sa;Pwd=198;"
        },new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_002;Uid=sa;Pwd=198;"
        },new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_003;Uid=sa;Pwd=198;"
        }
    }
});

 2、我们向主库中新增两条测试数据

//向指定表添加一行数据
db.Insertable<Test>(new Test()
{
    UserId = "zhangsan",
    Name = "张三001",
    Phone = "123456",
    IsDeleted = false,
    CreateTime = DateTime.Now,
    CreateUserId = "000",
    DeleteTime = DateTime.Now,
    DeleteUserId = "",
}).ExecuteCommand();

db.Insertable<Test>(new Test()
{
    UserId = "zhangsan",
    Name = "张三002",
    Phone = "123456",
    IsDeleted = false,
    CreateTime = DateTime.Now,
    CreateUserId = "000",
    DeleteTime = DateTime.Now,
    DeleteUserId = "",
}).ExecuteCommand();

3、运行,然后去数据库查看,如下图,实现了主次同步写入

 4、其实现在已经实现了读写分离,上面写入已经确认了,怎么验证读取呢?

如下图,我去次数据库修改了他们的UserId值 

5、 我们循环几次读取test表并监听SQL语句和打印UserId值,代码如下

using SqlSugar;

//实例化数据库链接
var db = new SqlSugarClient(new ConnectionConfig()
{
    ConnectionString = "server=.;Database=TESTDB;Uid=sa;Pwd=198;",//数据库链接字符串
    DbType = DbType.SqlServer,//指定数据库类型
    IsAutoCloseConnection = true,//链接使用完后是否自动释放
    InitKeyType = InitKeyType.Attribute,//从实体特性中读取主键自增列信息
    //从库链接
    SlaveConnectionConfigs = new List<SlaveConnectionConfig>() {
        new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_001;Uid=sa;Pwd=198;"
        },new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_002;Uid=sa;Pwd=198;"
        },new SlaveConnectionConfig(){
            HitRate =10,
            ConnectionString ="server=.;Database=SQLSugarDB_003;Uid=sa;Pwd=198;"
        }
    }
});

//监听SQL语句
db.Aop.OnLogExecuting = (sql, pra) =>
{
    Console.WriteLine($"-------------------------------------------------------------");
    Console.WriteLine($"sql语句:{sql}");
};

//获取首行数据
for (int i = 0; i < 5; i++)
{
    Test t = db.Queryable<Test>().First();
    Console.WriteLine("----------------------------------------------------------------");
    Console.WriteLine(t.UserId);
}

结果如下图,可知语句都是从test获取,但实际都是从库中读取,验证成功,读写分离实现

五、同步过程中会存在延迟,导致写入数据可能短时间内(通常就1s或不到1s)无法从次库读取到最新数据,可以添加以下代码,从主库读取

//设置查询可以通过主库查询
db.Ado.IsDisableMasterSlaveSeparation = true;

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐