赞
踩
面向对象的操作数据库,相比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;
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。