坪山网站建设基本流程,怎样免费做游戏代理,购物网站的后台做哪些东西,宣传广告制作书接上回#xff1a;数据库调优方案中数据库主从复制#xff0c;如何实现读写分离
ShardingSphere 实现读写分离的方式是通过配置数据源的方式#xff0c;使得应用程序可以在执行读操作和写操作时分别访问不同的数据库实例。这样可以将读取操作分发到多个从库#xff08;从…书接上回数据库调优方案中数据库主从复制如何实现读写分离
ShardingSphere 实现读写分离的方式是通过配置数据源的方式使得应用程序可以在执行读操作和写操作时分别访问不同的数据库实例。这样可以将读取操作分发到多个从库从服务器从而提高读取性能同时将写操作发送到主库主服务器以确保数据的一致性。
引入依赖 dependencygroupIdorg.apache.shardingsphere/groupIdartifactIdshardingsphere-jdbc-core-spring-boot-starter/artifactIdversion5.1.1/version/dependencydependencygroupIdcom.baomidou/groupIdartifactIdmybatis-plus-boot-starter/artifactIdversion3.5.2/version/dependencydependencygroupIdcom.mysql/groupIdartifactIdmysql-connector-j/artifactIdversion${mysql-version}/version/dependency
配置
# 读写分离配置
spring:shardingsphere:datasource:# 配置真实数据源names: master,slave1,slave2# 配置第 1 个数据源master:driver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/ssopassword: 123456type: com.zaxxer.hikari.HikariDataSourceusername: root# 配置第 2 个数据源slave1:driver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/sso_testpassword: 123456type: com.zaxxer.hikari.HikariDataSourceusername: root# 配置第 3 个数据源slave2:driver-class-name: com.mysql.jdbc.Driverjdbc-url: jdbc:mysql://127.0.0.1:3306/slave_testpassword: 123456type: com.zaxxer.hikari.HikariDataSourceusername: rootmode:# 内存模式type: Memory# 打印sqlprops:sql-show: truerules:readwrite-splitting:data-sources:myds:# 读数据源负载均衡算法名称load-balancer-name: alg_roundprops:# 读数据源名称多个从数据源用逗号分隔read-data-source-names: slave1,slave2# 写数据源名称write-data-source-name: master# 读写分离类型如: StaticDynamictype: Staticload-balancers:# 定义负载均衡算法随机轮询权重alg_random:type: RANDOMalg_round:type: ROUND_ROBINalg_weight:props:slave1: 1slave2: 2type: WEIGHT创建数据库表
由于主、从数据库里的数据是一样的所以sso和sso_test都用下面代码创建sys_business表
CREATE TABLE sys_business (id BIGINT NOT NULL AUTO_INCREMENT COMMENT 主键,avaliable TINYINT ( 1 ) DEFAULT 1 COMMENT 是否可用#0:禁用#1:启用,name VARCHAR ( 30 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT COMMENT 系统名称,permission VARCHAR ( 30 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT COMMENT 权限字符,path VARCHAR ( 100 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT COMMENT 路由地址,icon VARCHAR ( 30 ) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT COMMENT 图表,create_time datetime DEFAULT NULL COMMENT 创建时间,update_time datetime DEFAULT NULL COMMENT 更新时间,delete_flag TINYINT ( 1 ) DEFAULT 1 COMMENT 是否删除#1:未删除#0:已删除,
PRIMARY KEY ( id )
) ENGINE INNODB AUTO_INCREMENT 3 DEFAULT CHARSET utf8mb4 COLLATE utf8mb4_general_ci;编写实体类
Data
TableName(sys_business)
public class Sso {private Long id;private String name;
}
业务代码
mapper
public interface SsoMapper extends BaseMapperSso {
}service
public interface ISsoService extends IServiceSso {
}
service实现类
Service
public class ISsoServiceImpl extends ServiceImplSsoMapper, Sso implements ISsoService {
}测试
1、先在sso_test从读后向sso主插测试配置文件是否生效 Resourceprivate ISsoService iSsoService;RequestMapping(/slace_master)public boolean masterTest(){Sso sso iSsoService.getById(1L);System.out.println(sso.toString());return iSsoService.save(sso);}当前从库中的数据 主库此时还没有数据 运行后 先在从库中查出然后向主库中写入实现了数据的同步说明集成生效了。
2、先插主库后读从库没有加事务
因为sso_test没有对sso这个库的binlog日志进行监听现在这两个库是没有同步关系的写入sso后,不会同步到sso_test。
RequestMapping(insert_and_read)public boolean inAndRed(){Sso sso new Sso();sso.setId(2L);sso.setName(TestName1);boolean save iSsoService.save(sso);Sso byId iSsoService.getById(2L);System.out.println(byId);return save;}执行后主库中的数据 执行后从库中的数据 打印结果
在2中的方法上加事务Transactional注解会强制读取刚执行完写入的库也就是主库
RequestMapping(insert_and_read)Transactionalpublic boolean inAndRed(){Sso sso new Sso();sso.setId(2L);sso.setName(TestName1);boolean save iSsoService.save(sso);Sso byId iSsoService.getById(2L);System.out.println(byId);return save;}