ShardingSphere(七) 读写分离配置,实现分库读写操作
概述:本章通过介绍使用ShardingSphere实现数据库的读写分离操作。在实现读写分离之前,数据库的主从同步需要提前配置完成,主从同步实现不由Sharding提供。主从同步可参考上一章节《ShardingSphere(六) 读写分离之mysql 主从同步配置》。
环境:SpringBoot 2.2 + mybatis plus3.0 + Sharding jdbc4.0
需求:实现数据库新增修改删除操作操作3306端口的主库(3306/user_db),查询操作读取3307端口的从库(3307/user_db)。
项目目录结构:
步骤:
- 准备数据库环境
- idea创建maven工程,引入依赖
- 创建主启动类
- 编写业务代码
- 添加配置文件
- 编写测试代码测试验证
一、准备数据库环境
准备两个数据库服务器,实现主从同步配置,两个库user_db中都创建t_user表,表结构如下:
CREATE TABLE `t_user` (`user_id` bigint(20) NOT NULL,`username` varchar(50) NOT NULL,`ustatus` varchar(50) NOT NULL,PRIMARY KEY (`user_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
二、创建maven工程,引入依赖
创建maven工程,引入Shardingjdbc以及其他相关依赖,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>org.sharding</groupId><artifactId>sharding</artifactId><version>1.0-SNAPSHOT</version><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.2.2.RELEASE</version></parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId></dependency><dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>1.1.20</version></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.31</version></dependency><dependency><groupId>org.apache.shardingsphere</groupId><artifactId>sharding-jdbc-spring-boot-starter</artifactId><version>4.0.0-RC1</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.0.2</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build>
</project>
三、创建主启动类
src/main/java/com/xiaohui/ShardingApplication.java
package com.xiaohui;import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.xiaohui.mapper")
public class ShardingApplication {public static void main(String[] args) {SpringApplication.run(ShardingApplication.class,args);}
}
四、编写业务代码
主要为数据库实体类:src/main/java/com/xiaohui/entity/User.java
数据库层接口类:src/main/java/com/xiaohui/mapper/UserMapper.java
package com.xiaohui.entity;import com.baomidou.mybatisplus.annotation.TableName;
import lombok.Data;@Data
@TableName(value="t_user")
public class User {private Long userId;private String username;private String ustatus;
}
package com.xiaohui.mapper;import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.xiaohui.entity.User;
import org.springframework.stereotype.Repository;@Repository
public interface UserMapper extends BaseMapper<User> {
}
五、添加配置文件application.properties(重点)
#sharding-jdbc 读写分离
#=================================数据源配置部分=====================================
#数据源名称,多数据源以逗号分隔
spring.shardingsphere.datasource.names=ds2,slave0
#配置 ds0 ds1数据源具体内容
spring.shardingsphere.datasource.ds2.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.ds2.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.ds2.url=jdbc:mysql://127.0.0.1:3306/user_db
spring.shardingsphere.datasource.ds2.username=root
spring.shardingsphere.datasource.ds2.password=root
#从库
spring.shardingsphere.datasource.slave0.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave0.driver-class-name=com.mysql.jdbc.Driver
spring.shardingsphere.datasource.slave0.url=jdbc:mysql://127.0.0.1:3307/user_db
spring.shardingsphere.datasource.slave0.username=root
spring.shardingsphere.datasource.slave0.password=root#=================================主从数据库声明部分====================================
#配置指定主从数据库
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=ds2
spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=slave0
#=================================数据节点配置部分======================================
#设置表数据节点(最后的ms0 一定要注意,不能写ds2.t_user)
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ms0.t_user#=================================数据库分表策略========================================
#表策略table-strategy
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.sharding-column=user_id
spring.shardingsphere.sharding.tables.t_user.table-strategy.inline.algorithm-expression=t_user#==================================数据库字段生成策略====================================
#字段生成策略key-generator
spring.shardingsphere.sharding.tables.t_user.key-generator.column=user_id
spring.shardingsphere.sharding.tables.t_user.key-generator.type=SNOWFLAKE#==================================其他配置=============================================
#解决报错 Consider renaming one of the beans or enabling overriding...
spring.main.allow-bean-definition-overriding=true
#打开sql日志输出
spring.shardingsphere.props.sql.show=true
主从同步主要配置的为spring.shardingsphere.sharding.master-slave-rules 配置
spring.shardingsphere.sharding.master-slave-rules.ms0.master-data-source-name=ds2 spring.shardingsphere.sharding.master-slave-rules.ms0.slave-data-source-names=slave0
为主从同步部取一个名称为ms0,并指定其主数据库ds2,和从数据库slave0。
spring.shardingsphere.sharding.tables.t_user.actual-data-nodes=ms0.t_user
在设置表的数据节点时主要注意的是不能写主库或从库的数据库节点名称如ds2.t_user。。需要使用主从同步配置设置的节点名称ms0。
六、编写测试代码测试验证
src/test/java/com/xiaohui/MainTest.java
package com.xiaohui;import com.baomidou.mybatisplus.core.conditions.Wrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.xiaohui.entity.User;
import com.xiaohui.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;import java.util.List;@RunWith(SpringRunner.class)
@SpringBootTest
public class MainTest {@Autowiredprivate UserMapper userMapper;@Testpublic void testUserAdd(){User u = new User();u.setUsername("张三");u.setUstatus("1");userMapper.insert(u);}@Testpublic void testUserGet(){QueryWrapper wrapper = new QueryWrapper<User>();wrapper.eq("user_id", 564030748839903233L);User user = userMapper.selectOne(wrapper);System.out.println(user);}}
执行保存操作testUserAdd(),打印日志如下: 通过实际的sql 我们可以看到其操作的为ds2 即我们的主数据库。
2021-02-04 10:16:49.743 INFO 9428 --- [ main] ShardingSphere-SQL : Rule Type: sharding
2021-02-04 10:16:49.746 INFO 9428 --- [ main] ShardingSphere-SQL : Logic SQL: INSERT INTO t_user ( username,ustatus ) VALUES ( ?,? )
2021-02-04 10:16:49.746 INFO 9428 --- [ main] ShardingSphere-SQL : Actual SQL: ds2 ::: INSERT INTO t_user (username, ustatus, user_id) VALUES (?, ?, ?) ::: [张三, 1, 564030748839903233]
执行查询操作,打印日志如下:通过实际的sql 我们可以看到查询读取的为 slave0 从库,即已实现数据读写分离。
2021-02-04 10:20:13.929 INFO 1544 --- [ main] ShardingSphere-SQL : Rule Type: sharding
2021-02-04 10:20:13.931 INFO 1544 --- [ main] ShardingSphere-SQL : Logic SQL: SELECT user_id,username,ustatus FROM t_user WHERE user_id = ?
2021-02-04 10:20:13.931 INFO 1544 --- [ main] ShardingSphere-SQL : SQLStatement: SelectStatement(super=DQLStatement(super=AbstractSQLStatement(type=DQL, tables=Tables(tables=[Table(name=t_user, alias=Optional.absent())]), routeConditions=Conditions(orCondition=OrCondition(andConditions=[AndCondition(conditions=[Condition(column=Column(name=user_id, tableName=t_user), operator=EQUAL, compareOperator==, positionValueMap={}, positionIndexMap={0=0})])])), encryptConditions=Conditions(orCondition=OrCondition(andConditions=[])), sqlTokens=[TableToken(tableName=t_user, quoteCharacter=NONE, schemaNameLength=0)], parametersIndex=1, logicSQL=SELECT user_id,username,ustatus FROM t_user WHERE user_id = ?)), containStar=false, firstSelectItemStartIndex=8, selectListStopIndex=31, groupByLastIndex=0, items=[CommonSelectItem(expression=user_id, alias=Optional.absent()), CommonSelectItem(expression=username, alias=Optional.absent()), CommonSelectItem(expression=ustatus, alias=Optional.absent())], groupByItems=[], orderByItems=[], limit=null, subqueryStatement=null, subqueryStatements=[], subqueryConditions=[])
2021-02-04 10:20:13.932 INFO 1544 --- [ main] ShardingSphere-SQL : Actual SQL: slave0 ::: SELECT user_id,username,ustatus FROM t_user WHERE user_id = ? ::: [564030748839903233]
User(userId=564030748839903233, username=张三, ustatus=1)
ShardingSphere(七) 读写分离配置,实现分库读写操作相关推荐
- laravel实现数据库读写分离配置或者多读写分离配置
config\database.php里 读写分离:'mysql' => array( 'read' => array( 'host' => '192.168.1.1', ), 'w ...
- mysql 配置文件在哪_MySQL+MyCat分库分表 读写分离配置
一. MySQL+MyCat分库分表 1 MyCat简介 java编写的数据库中间件 Mycat运行环境需要JDK. Mycat是中间件,运行在代码应用和MySQL数据库之间的应用. 前身: corb ...
- MySQL的主从配置+SpringBoot的MySQL读写分离配置
MySQL的主从复制 点击前往查看MySQL的安装 1.主库操作 vim /etc/my.cnf 添加如下配置 log-bin=mysql-bin #[必须]启用二进制日志 server-id=128 ...
- Mysql一主多从和读写分离配置简记
Mysql一主多从和读写分离配置简记 标签: mysql数据库服务器class数据库servermanager 2012-05-30 16:44 14981人阅读 评论(1) 收藏 举报 分类: 数 ...
- SQL Server AlwaysOn读写分离配置
SQL Server AlwaysOn读写分离配置 pursuer.chen 备注: 作者:pursuer.chen 博客:http://www.cnblogs.com/chenmh 本站点所有随笔都 ...
- sqlserver AlwaysOn实现读写分离配置及java/net代码实现
1.用读写分离的原因: O.读写量很大,为了提升数据库读写性能,将读写进行分离: O.如果多机房下写少读多,同时基于数据一致性考虑,只有一个主库存入所有的数据写入,本地再做从库提供读取,减少多机房间直 ...
- MyCat:开源分布式数据库中间件之数据库分片和读写分离配置
mycat权威文档指南下载 1. MyCAT介绍 1.1. 什么是MyCAT? 简单的说,MyCAT就是: 一个彻底开源的,面向企业应用开发的"大数据库集群" 支持事务.ACI ...
- 读写分离时mycat不能链接mysql_Mycat读写分离配置实践
Mycat读写分离配置实践 发布时间:2020-08-16 01:08:20 来源:ITPUB博客 阅读:81 作者:jeanron100 工作这些年来,也去了一些地方,有了一些见闻,隐隐感觉很多文化 ...
- jedis 读写分离_Redis实现数据库读写分离
Redis是一种NoSQL的文档数据库,通过key-value的结构存储在内存中,Redis读的速度是110000次/s,写的速度是81000次/s,性能很高,使用范围也很广. 下面用一个实例实现re ...
- MySQL读写分离(二)——Atlas实现读写分离
[引言] Atlas是希腊神话被罚作苦役的大力神,在希腊神话中当巨人族首领泰坦反叛奥林匹斯众神战败后支持他的大多数都被打入地狱的黑暗深渊,而Atlas则被罚去西方站在地母盖 ...
最新文章
- 调整模型 与 提纯样本的关系过程有点类似EM算法过程,不知道这样理解是否是正确理解,固定A调B,B调到最优后,固定B再调A,循环往复,直至最优。
- 使用IDA Pro动态调试SO文件
- php怎样rc4加密,php 实现RC4加密解密
- java+classpath的理解_Java配置path和classpath的含义详解-Go语言中文社区
- python创建和删除文件有什么区别_python创建与删除临时文件夹的例子
- 2015-FCN论文解读
- php笔记--php安装
- GraphQL从入门到实战
- 《计算机入门》模拟卷 b卷,《计算机入门》模拟试卷B.doc
- APP兼容性专项测试
- 2.0 Mesh Beacon帧格式
- 移动端的兼容问题(ios和安卓)
- android 是否插入耳机,Android监听耳机是否插入
- 企业微信客户端通过jsapi调起微信扫码提示40093:jsapi签名错误
- 三毛的诗 I 如果有来生
- 重复图片查找清理工具:Duplicate Photos Fixer Pro for Mac
- SQL人的优势:实战大数据开发10分钟入门
- 【计算机网络复习】408王道视频总结 第四章:网络层
- 03-NodeMCU引脚和接线、点亮外部LED
- epub格式电子书剖析之一:文…
热门文章
- 诗与远方:无题(四十八)
- 诗与远方:无题(五)
- jsp学习之路之安装Apache Tomcat7.0服务器
- Drools集成SpringBootStarter
- Oracle的dbf文件迁移
- 实现option上下移动_JS实现Select的option上下移动的方法
- 用Java描述数据结构之二叉树,前序遍历,中序遍历,后序遍历
- 高通做服务器芯片有优势吗,为什么高通海思联发科不把芯片面积做的和苹果a系列一样大?性能不就赶上了吗?...
- PHP数组合并+与array_merge的区别分析 对多个数组合并去重技巧
- ant+jenkins+testng+selenium集成环境搭建