【项目升级】单库、多库、读写分离 · 任你选

本期配套视频

https://www.bilibili.com/video/BV1BJ411B7mn?p=6

(点击阅读原文,可看,如果没有,最晚下午可看)

继上周增加【任务调度】以后,继续对项目进行2.0版本升级,其实改动的地方并不多,主要的功能上,更丰富了,之前其实项目已经实现了多库的更新:

多库操作2:终于实现多个数据库操作

单单多库操作还不够完美,所以这几天就把读写分离给加上了,你可能会好奇,多库不就是读写分离么?主库和从库相互不影响的操作,满足xxxx的需求等等,其实不是的,至少在我这里两者不是一回事,下面我就简单的文字说一下,如果读不懂,或者不想读,可以直接看视频。

Github:相关代码目前在Is4分支。

1、多库操作与读写分离

单库模式就不说了,我们所有的项目都必须至少要支持这个,不然如何持久化?

多库操作,我理解的是,可以任意操作指定的任意数据库,只要允许访问,我们配置好连接字符串,并做一定的处理后,就可以CURD了,我这里可以简化称之为——C和Q,也就是命令和查询模式,命令就是指的写入、编辑、删除的操作。这里多个数据库是平等的,举个例子,我们可以在资源服务器Blog.Core中,来操作认证中心的role角色表,不仅可以读取,如果有必要,还可以修改,当然,这里业务上是不允许修改的。

读写分离,顾名思义,就是读(Q)和写(C)的动作是分开的,虽然也是多个数据库,虽然也是分主库和从库,但是读只能读取从库,写只能写在主库,这就是和普通的多库操作最大的也是最本质的不同之处。

简单解释过后,那我就说一下,Blog.Core项目中,如果实现单库模式、多库模式以及读写分离模式。

2、单库操作模式

这个很简单,当你第一次下载的时候,默认的就是单库模式:

MutiDBEnabled和CQRSEnabled都为false,所以如果你就只想连接一个数据库,那就把MainDB配置成下边对应的ConnId,然后把他对应Enabled设置为true就行了,其他的不用管,其他的就算设置为true,也不会影响。

举个例子,我只想配置一个SqlServer,连接字符串为xxxxxx:

  "MainDB": "WMBLOG_MSSQL_1", //当前项目的主库,所对应的连接字符串的Enabled必须为true"MutiDBEnabled": false, //是否开启多库模式"CQRSEnabled": false, //是否开启读写分离模式,必须是单库模式,且数据库类型一致,比如都是SqlServer"DBS": [{"ConnId": "WMBLOG_SQLITE","DBType": 2,"Enabled": false,"HitRate": 50, // 值越大,优先级越高"Connection": "WMBlog.db" //只写数据库名就行,我会拼接字符串},// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓{"ConnId": "WMBLOG_MSSQL_1","DBType": 1,"Enabled": true,"HitRate": 40,"Connection": "xxxxxx","ProviderName": "System.Data.SqlClient"},// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑{"ConnId": "WMBLOG_MSSQL_2","DBType": 1,"Enabled": true,"HitRate": 30,"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQ","ProviderName": "System.Data.SqlClient"},{"ConnId": "WMBLOG_MYSQL","DBType": 0,"Enabled": false,"HitRate": 20,"Connection": "Server=localhost; Port=3306;Stmt=; Database=wmblogdb; Uid=root; Pwd=456;"},{"ConnId": "WMBLOG_ORACLE","DBType": 3,"Enabled": false,"HitRate": 10,"Connection": "Provider=OraOLEDB.Oracle; Data Source=WMBlogDB; User Id=sss; Password=789;","OracleConnection_other1": "User ID=sss;Password=789;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.8.65)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = orcl)))"}],

就是这么简单,那下边简单说一下,如何配置多库。

3、多库操作模式

这个可能稍微麻烦一丢丢,我就直接写步骤了:

1、配置MainDB —— 主库Id;

2、配置MutiDBEnabled —— true,开启多库模式;

3、配置DBS —— 将需要用到的数据库节点,Enabled=true;

4、在指定的实体类上边增加特性,指定对应的从库的连接Id;

举例说明,我想配置一个多库操作,主库是Sqlite,从库是Sqlserver:

  "MainDB": "WMBLOG_SQLITE", //当前项目的主库,所对应的连接字符串的Enabled必须为true"MutiDBEnabled": true, //是否开启多库模式"CQRSEnabled": false, //是否开启读写分离模式,必须是单库模式,且数据库类型一致,比如都是SqlServer"DBS": [// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓{"ConnId": "WMBLOG_SQLITE","DBType": 2,"Enabled": true,// 主库"HitRate": 50, // 值越大,优先级越高"Connection": "WMBlog.db" //只写数据库名就行,我会拼接字符串},{"ConnId": "WMBLOG_MSSQL_1","DBType": 1,"Enabled": true,// 从库"HitRate": 40,"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_1;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False","ProviderName": "System.Data.SqlClient"},// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑{"ConnId": "WMBLOG_MYSQL","DBType": 0,"Enabled": false,// 不开启"HitRate": 20,"Connection": "Server=localhost; Port=3306;Stmt=; Database=wmblogdb; Uid=root; Pwd=456;"},{"ConnId": "WMBLOG_ORACLE","DBType": 3,"Enabled": false,// 不开启"HitRate": 10,"Connection": "Provider=OraOLEDB.Oracle; Data Source=WMBlogDB; User Id=sss; Password=789;","OracleConnection_other1": "User ID=sss;Password=789;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.8.65)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = orcl)))"}],

这样配置好后,我们的主库就是WMBLOG_SQLITE,一个从库是WMBLOG_MSSQL_1

然后配置下对应的实体类特性,指定这个表是从库的表:

然后我们可以看看,系统启动后,是怎么样的:

从启动日志上,我们可以看出来,已经实现了我们的目的。

4、读写分离模式

这个读写分离模式,其实和多库模式差不多,只不过更简单了:

1、配置MainDB —— 主库Id;

2、配置CQRSEnabled —— true,开启读写分离模式,必须是单库

3、配置DBS —— 将需要用到的数据库节点,Enabled=true;

举个例子,我想开启主库为WMBLOG_MSSQL_1,从库为WMBLOG_MSSQL_2:

  "MainDB": "WMBLOG_MSSQL_1", //当前项目的主库,所对应的连接字符串的Enabled必须为true"MutiDBEnabled": false, //是否开启多库模式"CQRSEnabled": true, //是否开启读写分离模式,必须是单库模式,且数据库类型一致,比如都是SqlServer"DBS": [{"ConnId": "WMBLOG_SQLITE","DBType": 2,"Enabled": false,"HitRate": 50, // 值越大,优先级越高"Connection": "WMBlog.db" //只写数据库名就行,我会拼接字符串},// ↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓{"ConnId": "WMBLOG_MSSQL_1","DBType": 1,"Enabled": true,"HitRate": 40,"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_1;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False","ProviderName": "System.Data.SqlClient"},{"ConnId": "WMBLOG_MSSQL_2","DBType": 1,"Enabled": true,"HitRate": 30,"Connection": "Data Source=(localdb)\\MSSQLLocalDB;Initial Catalog=WMBLOG_MSSQL_2;Integrated Security=True;Connect Timeout=30;Encrypt=False;TrustServerCertificate=False;ApplicationIntent=ReadWrite;MultiSubnetFailover=False","ProviderName": "System.Data.SqlClient"},// ↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑↑{"ConnId": "WMBLOG_MYSQL","DBType": 0,"Enabled": false,"HitRate": 20,"Connection": "Server=localhost; Port=3306;Stmt=; Database=wmblogdb; Uid=root; Pwd=456;"},{"ConnId": "WMBLOG_ORACLE","DBType": 3,"Enabled": false,"HitRate": 10,"Connection": "Provider=OraOLEDB.Oracle; Data Source=WMBlogDB; User Id=sss; Password=789;","OracleConnection_other1": "User ID=sss;Password=789;Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.8.65)(PORT=1521)))(CONNECT_DATA=(SERVICE_NAME = orcl)))"}],

这里要注意一下:

1、开启读写分离模式的话,就必须要是单库模式,把MutiDBEnabled关掉,其实不关也行,只不过后期你可能会绕不过来,干脆禁掉。

2、不用再配置实体类了。

我们来看看系统启动日志:

目前是按照完美的设想进行的,那到底数据是不是成功呢,我们做下测试。

我们执行博客数据查询,总数是41条,这是读操作,走的是从库

然后,我们添加一条数据,这是写命令,走的是主库

可以看到,我们新建了一个Id是54的博客,但是我们能查询出来么?

答案是否定的,因为我们的查询是从库,这也就是证明了我们的读写分离已经生效了。

好啦,今天的内容暂时就写到这里吧,详细的说明和操作都在视频里,感兴趣的可以去看看。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/310898.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数论算法训练

知识点: 如果a,b均是正整数且互质,那么由axby,x>0,y>0,那么由这两个数不能组成的最大的数是:a*b-a-b 我们可以发现,模9的时候有这样一个规律: 对X模Y,其实等于X每一位的数的和SUM模Y。 记住,这个方法只能模9的时…

基于matlab的数字下变频器的设计与仿真应用,基于MATLAB的数字下变频器的没汁与仿真应用...

基于MATLAB的数字下变频器的没汁与仿真应用范文晶;王海;周渭;钱时祥;江炜宁【期刊名称】《电子质量》【年(卷),期】2009(000)003【摘要】文中应用软件无线电思想对数字下变频器中的几个关键技术进行了研究,对下变频各个模块所涉及到的CIC、HB、FIR等关键算法进行了讨论、提炼与…

.Net微服务实战之技术选型篇

王者荣耀 去年我有幸被老领导邀请以系统架构师的岗位带技术团队,并对公司项目以微服务进行了实施。无论是技术团队还是技术架构都是由我亲自的从0到1的选型与招聘成型的,此过程让我受益良多,因此也希望在接下来的系列博文尽可能的与大家分享…

数据结构巩固训练

[蓝桥杯2019初赛]完全二叉树的权值-完全二叉树的性质 [蓝桥杯2015初赛]生命之树-求树的最大子树权值和 [蓝桥杯][2013年第四届真题]危险系数-dfs图的遍历 [蓝桥杯][历届试题]网络寻路-dfs,图的遍历 洛谷 P1294 高手去散步-邻接矩阵dfs-求无向图的一条最长路径 …

autohotkey php,Autohotkey+php实现免浏览器听录音

环境说明:Elastix 2.5ln -s /var/spool/asterisk/monitor /var/www/html/接口文件(php):$conmysql_connect("localhost","root","passwd");if(!$con) echo "没有连接成功!";mysql_select_db("asteriskcdrd…

.NET Core开发实战(第32课:集成事件:解决跨微服务的最终一致性)--学习笔记...

32 | 集成事件:解决跨微服务的最终一致性首先看一下集成事件的工作原理它的目的时为了实现系统的集成,它主要是用于系统里面多个微服务之间相互传递事件集成事件的实现方式有两种,一种是图上显示的发布订阅的方式,通过 EventBus&a…

[观察,找规律]算法题目训练

[蓝桥杯2019初赛]旋转-找规律蓝桥杯2017初赛-打印大X-找规律[蓝桥杯2018初赛]分数-找规律[蓝桥杯2019初赛]矩形切割-找规律[蓝桥杯2018初赛]方格计数-巧妙枚举,找规,数论[蓝桥杯2016初赛]煤球数目-找规律

mysql多实例复制,Mysql实例使用Rotate Master实现MySQL 多主复制的实现方法

搜索热词《MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法》要点:本文介绍了MysqL实例使用Rotate Master实现MysqL 多主复制的实现方法,希望对您有用。如果有疑问,可以联系我们。当然,5.6的GUID功能的出现也带来了multi-master的无…

Dapper操作MySQL数据库获取JSON数据中文乱码

在项目中利用Dapper将JSON数据存储到MySQL数据库,结果发现JSON数据中的中文乱码,特此记录,希望对存储JSON的童鞋能有所帮助,文中若有错误之处,还望批评指正。为了引出最终问题出在什么地方,我们重头开始进行…

C++set容器去重法

给出一个10位数&#xff0c;它如果每个位的数都把0-9这10个数都只用了一次&#xff0c;就输出yes&#xff0c;否则输出no #include <iostream> #include <set> using namespace std; set<int>s; typedef long long LL;int main() {LL n;while (cin >>…

django mysql connector,MySQL Connector / python在Django中不起作用

我正在学习以MySQL为后端的Django。 我安装了Oracle的mysql连接器以与mysql连接。 但是&#xff0c;当我运行python manage.py时&#xff0c;出现此错误Traceback (most recent call last):File"C:\Python33\lib\site-packages\django\db\backends\mysql\base.py", l…

流传在程序员中的传说,你知道几个?

在号称从事高薪新 科技工作的程序员周遭流传着许多与他们单纯气质不符的传说在这些被神秘面纱笼罩的人群中即使是从事着同一工种都有着许许多多科学无法解释的差异老程序员们对此讳莫如深新程序员们却有时感到惶恐不安...这背后究竟是道德的扭曲还是人性的沦丧倒是都并不至于只…

C++关于getline()和getchar()的小点

getchar只能“吃”一个字符&#xff0c;而getline可以“吃”一行字符 代码如下: #include <iostream> #include <cstring> using namespace std;int main() {char c;cin>>c;string line;getline(cin,line);cout<<c<<endl;cout<<line<…

php 如何生成二级目录json,使用PHP根据已解码的JSON创建文件夹/文件结构

例如,我下面有一个build.json文件.包含我在JSON中创建的基本文件夹/文件结构.{"folders": [{"name": "folder-a","files": [{"name": "file-a.html"},{"name": "file-b.html"}],"folder…

谁说docker-compose不能水平扩展容器、服务多实例?

❝虽说我已经从docker-compose走上了docker swarm的邪门歪道&#xff0c;目前被迫走在k8s这条康庄大道&#xff0c; 但是我还是喜欢docker-compose简洁有效的部署方式。❞曾其何时docker-compose非常适合开发、测试、快速验证原型&#xff0c;这个小工具让单机部署容器变得简洁…

C++substr()用法

substr()用法: string 需要截取的字符串 a 截取字符串的开始位置&#xff08;注&#xff1a;当a等于0或1时&#xff0c;都是从第一位开始截取&#xff09; b 要截取的字符串的长度 注意:第3个参数是要截取字符串的长度

.NET Core开发实战(第33课:集成事件:使用RabbitMQ来实现EventBus)--学习笔记(上)...

33 | 集成事件&#xff1a;使用RabbitMQ来实现EventBus这一节我们来讲解如何通过 CAP 组件和 RabbitMQ 来实现 EventBus要实现 EventBus&#xff0c;我们这里借助了 RabbitMQ&#xff0c;它的整个安装和使用的体验是非常人性化的&#xff0c;如果是在 Windows 下开发的话&#…

nginx php iconv,Nginx +PHP部署一

Nginx PHP部署一Alvin.zeng目录一、安装PHP1、Yum安装需要的包yum -y install gcc gcc-c autoconf libjpeg libjpeg-devel libpng libpng-devel freetype freetype-devel libxml2 libxml2-devel zlib zlib-devel glibc glibc-devel glib2 glib2-devel bzip2 bzip2-devel ncurs…

递归算法训练

[蓝桥杯]字母组串-递归[蓝桥杯][基础练习VIP]FJ的字符串-递归

以Blog.Core的方式来打开Abp.vNext

&#xff08;发现Abp这个logo真像佐助写轮眼&#xff09;最近自己的框架已经基本的成型了&#xff0c;当然还有很多质疑的地方&#xff0c;比如这些人是这么说的&#xff0c;基本都是原文&#xff1a;你的教程太乱了&#xff0c;和框架代码都不一样&#xff08;&#xff1f;&am…