上一篇文章《如何使用docker搭建一个mysql5.7的主从环境》我们使用docker的方式搭建了一个mysql5.7的master-slave模式,在这里我们java程序演示下如何做到自动入库的时候向master入库,查询的时候自动向slave查询。
在这里我们使用的是sharding-jdbc,由于我们现在几乎都是springboot的项目,所以在这里我们直接搭配对应的starter即可。下面说下具体的步骤。
一,在搭建的主从数据库中的master上创建一个user表。
CREATE TABLE `user` ( `id` int(11) NOT NULL COMMENT '主键', `name` varchar(255) DEFAULT NULL COMMENT '姓名', `age` tinyint(2) DEFAULT NULL COMMENT '年龄', `tenant_id` tinyint(1) DEFAULT NULL COMMENT '租户id', PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
二、然后创建一个spring-boot的maven项目
这里我们使用之前的mybatisplus的项目进行改造演示就可以了。文末提供项目下载
三、添加maven依赖
<dependency> <groupId>org.apache.shardingsphere</groupId> <artifactId>sharding-jdbc-spring-boot-starter</artifactId> <version>4.0.0-RC1</version> </dependency> <!-- https://mvnrepository.com/artifact/com.alibaba/druid --> <dependency> <groupId>com.alibaba</groupId> <artifactId>druid</artifactId> <version>1.1.10</version> </dependency>
四、改造配置文件 application.yml,添加如下内容:
#数据库的配置信息 spring: shardingsphere: datasource: names: master,slave # 主数据源 master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.31.30:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 # 从数据源 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.31.30:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 masterslave: # 读写分离配置,设置负载均衡的模式为轮询 load-balance-algorithm-type: round_robin # 最终的数据源名称 name: dataSource # 主库数据源名称 master-data-source-name: master # 从库数据源名称列表,多个逗号分隔 slave-data-source-names: slave props: sql: show: true #开启SQL显示,默认false # 覆盖注册bean,后面创建数据源会覆盖前面创建的数据源 main: allow-bean-definition-overriding: true
完整的演示项目配置文件如下
#端口号 server: port: 8088 #数据库的配置信息 spring: mybatis: #开启驼峰命名法 configuration: map-underscore-to-camel-case: true mybatis-plus: # xml地址 mapper-locations: classpath:mapper/*Mapper.xml # 实体扫描,多个package用逗号或者分号分隔 type-aliases-package: com.mybatisplus.demo.entity #自己的实体类地址 configuration: # 这个配置会将执行的sql打印出来,在开发或测试的时候可以用 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl shardingsphere: datasource: names: master,slave # 主数据源 master: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.31.30:3307/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 # 从数据源 slave: type: com.alibaba.druid.pool.DruidDataSource driver-class-name: com.mysql.jdbc.Driver url: jdbc:mysql://192.168.31.30:3308/test?useUnicode=true&characterEncoding=utf-8&useSSL=false username: root password: 123456 masterslave: # 读写分离配置,设置负载均衡的模式为轮询 load-balance-algorithm-type: round_robin # 最终的数据源名称 name: dataSource # 主库数据源名称 master-data-source-name: master # 从库数据源名称列表,多个逗号分隔 slave-data-source-names: slave props: sql: show: true #开启SQL显示,默认false # 覆盖注册bean,后面创建数据源会覆盖前面创建的数据源 main: allow-bean-definition-overriding: true
五、进行测试
1)演示插入一条数据
直接访问:http://localhost:8088/user/saveInfo
此时我们在后台可以看到日志,数据是向master写的
2)演示查询一条数据
访问:http://localhost:8088/user/getInfo?userId=1
此时我们在后台可以看到日志,数据是从slave上读取的
在这里,我们一个简单的读写分离就完成了。
备注:
1、使用sharding-jdbc进行数据库的读写分离主要是进行配置即可,原来的代码是不需要做任何改动的。
完整代码下载:代码下载
还没有评论,来说两句吧...