mysql读写分离sharejdbc_sharding-JDBC 实现读写分离

本文介绍了如何通过Sharding-JDBC实现MySQL的读写分离,包括配置主从库,实现负载均衡,并展示了如何手动强制部分读请求到主库以应对实时性需求。此外,还提供了单测案例来验证读取操作的路由效果。
摘要由CSDN通过智能技术生成

需求

一主两从,做读写分离。

多个从库之间实现负载均衡。

可手动强制部分读请求到主库上。(因为主从同步有延迟,对实时性要求高的系统,可以将部分读请求也走主库)

本次不讨论 MySQL如何配置主从同步相关问题

库表SQL

-- 主库

CREATE DATABASE `master`;

CREATE TABLE `t_order` (

`order_id` int(11) NOT NULL,

`user_id` int(11) NOT NULL,

`business_id` int(4) DEFAULT NULL,

PRIMARY KEY (`order_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_order` VALUES (1,1,112);

-- 从库1

CREATE DATABASE `slave1` ;

CREATE TABLE `t_order` (

`order_id` int(11) NOT NULL,

`user_id` int(11) NOT NULL,

`business_id` int(4) DEFAULT NULL,

PRIMARY KEY (`order_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;

INSERT INTO `t_order` VALUES (2,2,112);

-- 从库2

CREATE DATABASE `slave2` ;

CREATE TABLE `t_order` (

`order_id` int(11) NOT NULL,

`user_id` int(11) NOT NULL,

`business_id` int(4) DEFAULT NULL,

PRIMARY KEY (`order_id`)

) ENGINE=InnoDB DEFAULT CHARSET=utf8;

INSERT INTO `t_order` VALUES (3,3,112);

pom.xml

io.shardingjdbc

sharding-jdbc-core

2.0.0.M2

io.shardingjdbc

sharding-jdbc-spring-namespace

2.0.0.M2

spring配置文件

destroy-method="close">

destroy-method="close">

destroy-method="close">

单测

写:

@Test

public void insert() throws Exception {

Order record = new Order();

record.setBusinessId(112);

record.setUserId(111);

record.setOrderId(12212121);

int result = orderMapper.insertSelective(record) ;

System.out.println( result > 0 ? "插入成功" : "插入失败");

}

运行结果:

e2726dbb4363d3f1b69610082d8c8970.png

查:

slave1 只有1条数据,主键order_id = 2 ; slave2 也只有1条数据,主键order_id = 3 。所以,如果查询到的结果orderId等于1就说明读请求进入到slave1,同理,如果查询出来的orderId等于0 就说明读请求进入到slave2。

public void selectByExample3() throws Exception {

final int[] slave1 = {0};

final int[] slave2 = {0};

for (int i = 0; i < 100; i++) {

((Runnable) () -> {

OrderExample example = new OrderExample();

example.createCriteria().andBusinessIdEqualTo(112);

List orderList = orderMapper.selectByExample(example);

if (orderList.get(0).getOrderId() == 2) {

System.out.printf("读到slave1 读到的数据是{}", JSONObject.toJSONString(orderList.get(0)));

slave1[0]++;

} else if (orderList.get(0).getOrderId() == 3) {

System.out.printf("读到slave2 读到的数据是{}", JSONObject.toJSONString(orderList.get(0)));

slave2[0]++;

}

System.out.println(JSONObject.toJSONString(orderList));

}).run();

}

System.out.println("+++++++++++++++++++++++++++++++++++++++");

System.out.println("+++++++++++++++++++++++++++++++++++++++");

System.out.println("slave1读到的次数-->" + slave1[0]);

System.out.println("slave2读到的次数-->" + slave2[0]);

System.out.println("+++++++++++++++++++++++++++++++++++++++");

System.out.println("+++++++++++++++++++++++++++++++++++++++");

}

运行截图:

d8b958af6b75dcc8c74c76cf8ff5c486.png

强制路由

通常做读写分离,都会遇到的一个问题就是主从同步延迟。有时,为了简单解决主从同步问题,我们会想强制部分读请求到主库上,而非从库上。

HintManager 分片键值管理器

但是对于读写分离这种形式的强制路由 , 其实官方文档说的几个方法都不适用. 我们可使用hintManager.setMasterRouteOnly() .

单测

@Test

public void HintManagerTest() {

HintManager hintManager = HintManager.getInstance() ;

hintManager.setMasterRouteOnly();

OrderExample example = new OrderExample();

example.createCriteria().andBusinessIdEqualTo(112);

List orderList = orderMapper.selectByExample(example);

System.out.println(JSONObject.toJSONString(orderList));

hintManager.close();

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值