springboot(二十二)-sharding-jdbc-读写分离
前面我们使用sharding-jdbc配置了分库分表。sharding-jdbc还有个用法,就是实现读写分离。
什么时候需要或者可以使用读写分离?
当我们的项目所使用的数据库查询的访问量,访问频率,及访问的并发量远大于修改的时候,我们需要将访问数据库的方式读写分离。比如我们使用的微博,更多人都只是刷一刷,发布微博动态的次数还是远小于我们刷微博的次数的。
sharding-jdbc
sharding-jdbc较于MyCat,我认为最大的优势是:sharding-jdbc是轻量级的第三方工具,我们只需要在项目中引用指定的jar包即可,然后根据项目的业务需要配置分库分表或者读写分离的规则和方式。
我们开始实现读写分离:
一. 先准备好数据库
我们在自己本地新建三个一毛一样的数据库database0,database1,database2.然后这三个数据库里各建一张user表:
CREATE TABLE `user` (
`id` bigint() NOT NULL AUTO_INCREMENT,
`city` varchar() NOT NULL,
`name` varchar() NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT= DEFAULT CHARSET=utf8; -- ----------------------------
-- Records of user
-- ----------------------------
INSERT INTO `user` VALUES ('', 'beijing', 'dalaoyang');---database0数据
INSERT INTO `user` VALUES ('', 'beijing', 'dalaoyang');---database0数据
INSERT INTO `user` VALUES ('101', 'beijing', 'dalaoyang');---database1数据
INSERT INTO `user` VALUES ('101', 'beijing', 'dalaoyang');---database2数据
因为是例子,我们三个database就放在同一台电脑的同一个数据库中了。实际情况下,使用到sharding-jdbc来做读写分离的话,一定是拥有海量数据的项目,一般会又多台数据库服务器。因为这些服务器需要实现数据同步。关于数据同步,后面再说。
二. 新建springboot项目吧
1.pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion> <groupId>com.dalaoyang</groupId>
<artifactId>springboot2_shardingjdbc_dxfl</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot2_shardingjdbc_dxfl</name>
<description>springboot2_shardingjdbc_dxfl</description> <parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.9.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent> <properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
<java.version>1.8</java.version>
</properties> <dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.3.1</version>
</dependency> <dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>1.1.1</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency> <dependency>
<groupId>io.shardingjdbc</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>2.0.0.M3</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>1.1.3</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.4</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
</dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency> </dependencies> <build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
</plugins>
</build> </project>
这里主要是加上sharding-jdbc-spring-boot-starter的启动器,注意版本就好。
这里插上一句,很多人都说现在的程序员必须要会,并且使用springboot,除了springboot自身的各种优势和便利意外,你会发现,很多优秀的第三方工具都自觉加入了springboot的怀抱,springboot要使用这些第三方工具包的时候,只需要在pom文件中注入对应的依赖就可。除了这个sharding-jdbc,还有比如,redis,solr,mybatis,kafka,elasticsearch等等等等,很多很多。
用起来就一个字“爽的呀批”;
2.application.yml
server:
port: 8084
sharding:
jdbc:
datasource:
names: ds0,ds1,ds2
ds0:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database0
username: root
password: 1234
ds1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database1
username: root
password: 1234
ds2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.jdbc.Driver
url: jdbc:mysql://localhost:3306/database2
username: root
password: 1234
config:
sharding:
props:
sql.show: true
masterslave:
load-balance-algorithm-type: round_robin
name: dataSource
master-data-source-name: ds0
slave-data-source-names: ds1,ds2
配置三个数据源,然后主数据库为ds0,从数据库为ds1和ds2.
主数据库是修改操作使用的,从数据库是查询使用的。这是默认的。
然后从数据库的配置规则是轮询(round_robin),配置规则还有一个:随机(random)
3.访问接口提供下
@RestController
public class UserController { @Autowired
private UserMapper userMapper; @GetMapping("save")
public void save(){
User user = new User();
user.setName("dalaoyang");
user.setCity("beijing");
userMapper.insertSelective(user);
} @GetMapping("getAll")
public Object getAll(){
return userMapper.selectAll();
}
}
其他的启动类啊,service,mapper之类的就写了,没啥特别的。详细的下载代码。
测试
启动项目,多次访问localhost:8084/getAll。
得到的数据为:
[{"id":10001,"city":"beijing","name":"dalaoyang1"}]和[{"id":10002,"city":"beijing","name":"dalaoyang2"}]
轮番出现,这就说明数据库ds1和ds2被轮询访问。
再多次访问localhost:8084/save
看数据库,你会发现插入的数据都保存在ds0中。
那么这时可以说,我们实现了读写分离。
代码下载地址:https://gitee.com/fengyuduke/my_open_resources/blob/master/springboot2_shardingjdbc_dxfl.zip
springboot(二十二)-sharding-jdbc-读写分离的更多相关文章
- SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂)
SpringBoot第十二集:度量指标监控与异步调用(2020最新最易懂) Spring Boot Actuator是spring boot项目一个监控模块,提供了很多原生的端点,包含了对应用系统的自 ...
- FreeSql (二十二)Dto 映射查询
适合喜欢使用 dto 的朋友,很多时候 entity 与 dto 属性名相同,属性数据又不完全一致. 有的人先查回所有字段数据,再使用 AutoMapper 映射. 我们的功能是先映射,再只查询映射好 ...
- Alink漫谈(二十二) :源码分析之聚类评估
Alink漫谈(二十二) :源码分析之聚类评估 目录 Alink漫谈(二十二) :源码分析之聚类评估 0x00 摘要 0x01 背景概念 1.1 什么是聚类 1.2 聚类分析的方法 1.3 聚类评估 ...
- [分享] IT天空的二十二条军规
Una 发表于 2014-9-19 20:25:06 https://www.itsk.com/thread-335975-1-1.html IT天空的二十二条军规 第一条.你不是什么都会,也不是什么 ...
- Bootstrap <基础二十二>超大屏幕(Jumbotron)
Bootstrap 支持的另一个特性,超大屏幕(Jumbotron).顾名思义该组件可以增加标题的大小,并为登陆页面内容添加更多的外边距(margin).使用超大屏幕(Jumbotron)的步骤如下: ...
- Web 前端开发精华文章推荐(HTML5、CSS3、jQuery)【系列二十二】
<Web 前端开发精华文章推荐>2014年第一期(总第二十二期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML ...
- 二十二、OGNL的一些其他操作
二十二.OGNL的一些其他操作 投影 ?判断满足条件 动作类代码: ^ $ public class Demo2Action extends ActionSupport { public ...
- WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇]
原文:WCF技术剖析之二十二: 深入剖析WCF底层异常处理框架实现原理[中篇] 在[上篇]中,我们分别站在消息交换和编程的角度介绍了SOAP Fault和FaultException异常.在服务执行过 ...
- VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池
VMware vSphere 服务器虚拟化之二十二桌面虚拟化之创建View Composer链接克隆的虚拟桌面池 在上一节我们创建了完整克隆的自动专有桌面池,在创建过程比较缓慢,这次我们将学习创建Vi ...
- Bootstrap入门(二十二)组件16:列表组
Bootstrap入门(二十二)组件16:列表组 列表组是灵活又强大的组件,不仅能用于显示一组简单的元素,还能用于复杂的定制的内容. 1.默认样式列表组 2.加入徽章 3.链接 4.禁用的列表组 5. ...
随机推荐
- 开始JavaScript的学习了
为何学习? 1. 所有主流浏览器都支持JavaScript. 2. 目前,全世界大部分网页都使用JavaScript. 3. 它可以让网页呈现各种动态效果. 4. 做为一个Web开发师,如果你想提供漂 ...
- 码云上webide怎么提交
修改后想提交,它会提示:“暂存文件后才能提交”, 我拿放大镜找遍了整个界面也没找到“暂存”按钮, 原来,文件旁边那个+号就是暂存,好歹鼠标方式去之后给个tip,服了. 点一下这个加号,提交按钮就可用了 ...
- Cinder AZ 与 Nova AZ 的同步问题
问题 今天处理了一个 Boot from volume 失败的问题,错误日志给出了明确的原因:The instance and volume are not in the same AZ. Build ...
- Python——作业12(选做)选中矩阵的每行或每列画出对应的折线图(python programming)
import os import platform import sys from PyQt5.QtCore import * from PyQt5.QtGui import * from PyQt5 ...
- SAS数据挖掘实战篇【一】
SAS数据挖掘实战篇[一] 1数据挖掘简介 1.1数据挖掘的产生 需求是一切技术之母,管理和计算机技术的发展,促使数据挖掘技术的诞生.随着世界信息技术的迅猛发展,信息量也呈几何指数增长,如何从巨量.复 ...
- Python浮点型数据小数点的取舍
python默认的是17位小数的精度 1.round()内置方法 π=3.1415926535 new_num=round(π,2) #四舍五入保留两位小数 print(new_num) ...
- ubuntu install themes && use it
one step: I am going to show you the installation of a theme with Numix theme and Unity Tweak Tool. ...
- Appium,AirTest切换使用时,appium罢工之坑(1)
由于一些元素不能定位,所以最近项目引用了Airtest 问题场景: case的开始使用appium,case执行过程中,切换到airtest操作元素,待执行完airtest相关步骤之后,后续使用app ...
- PHP 註解規則使用方式
/** * 函數名稱 * 函數描述(有些會含HTML代碼) * * @access 變數可存取的權限 (Example: Public or Private) * @api 爲第三方來源的變數 * @ ...
- Replace Words
In English, we have a concept called root, which can be followed by some other words to form another ...