Sharding-JDBC讀寫分離如何配置?主從數(shù)據(jù)庫實現(xiàn)詳解
1、讀寫分離簡介
對于同一時刻有大量并發(fā)讀操作和較少寫操作類型的應用系統(tǒng)來說,將數(shù)據(jù)庫拆分為主庫和從庫,主庫負責處理事務性的增刪改操作,從庫負責處理查詢操作,能夠有效的避免由數(shù)據(jù)更新導致的行鎖,使得整個系統(tǒng)的查詢性能得到極大的改善。

通過一主多從的配置方式,可以將查詢請求均勻的分散到多個數(shù)據(jù)副本,能夠進一步的提升系統(tǒng)的處理能力。 使用多主多從的方式,不但能夠提升系統(tǒng)的吞吐量,還能夠提升系統(tǒng)的可用性,可以達到在任何一個數(shù)據(jù)庫宕機,甚至磁盤物理損壞的情況下仍然不影響系統(tǒng)的正常運行。

讀寫分離的數(shù)據(jù)節(jié)點中的數(shù)據(jù)內(nèi)容是一致的,而水平分片的每個數(shù)據(jù)節(jié)點的數(shù)據(jù)內(nèi)容卻并不相同。
將水平分片和讀寫分離聯(lián)合使用,能夠更加有效的提升系統(tǒng)的性能。
Sharding-JDBC讀寫分離則是根據(jù)SQL語義的分析,將讀操作和寫操作分別路由至主庫與從庫。
它提供透明化讀寫分離,讓使用方盡量像使用一個數(shù)據(jù)庫一樣使用主從數(shù)據(jù)庫集群。

Sharding-JDBC提供一主多從的讀寫分離配置,可獨立使用,也可配合分庫分表使用,同一線程且同一數(shù)據(jù)庫連接內(nèi),如有寫入操作,以后的讀操作均從主庫讀取,用于保證數(shù)據(jù)一致性。Sharding-JDBC不提供主從數(shù)據(jù)庫的數(shù)據(jù)同步功能,需要采用其他機制支持。

2、讀寫分離實現(xiàn)
模擬系統(tǒng)使用,讀寫分離
將數(shù)據(jù)庫分為:3306中的test 與 3307中的test
表名稱:user
1、SQL:
//創(chuàng)建數(shù)據(jù)表
CREATE TABLE `user` (
`id` BIGINT(20) NOT NULL COMMENT 'Id',
`name` VARCHAR(20) NOT NULL COMMENT '名稱',
`phone` VARCHAR(20) NOT NULL COMMENT '電話',
`email` VARCHAR(20) NOT NULL COMMENT '郵箱',
PRIMARY KEY (`id`)
)
2、properties配置:
#sharding-jdbc 水平分庫規(guī)則配置 # 數(shù)據(jù)源名稱,多數(shù)據(jù)源逗號隔開 spring.shardingsphere.datasource.names=ds0,ds1 # 配置第一個庫 spring.shardingsphere.datasource.ds0.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds0.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds0.jdbc-url=jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai spring.shardingsphere.datasource.ds0.username=root spring.shardingsphere.datasource.ds0.password=123456 # 配置第二個庫 spring.shardingsphere.datasource.ds1.type=com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.ds1.driver-class-name=com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.ds1.jdbc-url=jdbc:mysql://127.0.0.1:3307/test?useUnicode=true&useSSL=false&zeroDateTimeBehavior=convertToNull&characterEncoding=UTF-8&allowMultiQueries=true&serverTimezone=Asia/Shanghai spring.shardingsphere.datasource.ds1.username=root spring.shardingsphere.datasource.ds1.password=123456 # 配置主從規(guī)則 # 指定主庫,ms為任意值,表主從同步別名 spring.shardingsphere.sharding.master-slave-rules.ms.master-data-source-name=ds0 # 指定從庫,ms為任意值,表主從同步別名 spring.shardingsphere.sharding.master-slave-rules.ms.slave-data-source-names=ds1 # 如果既有讀寫分離又有數(shù)據(jù)分片,則配置規(guī)則如下: # actual-data-nodes節(jié)點后的數(shù)據(jù)源名稱要寫成,主從同步數(shù)據(jù)源的別名 : ms # spring.shardingsphere.sharding.tables.user.actual-data-nodes = ms.t_user ## 打開sql輸出日志 spring.shardingsphere.props.sql.show=true
3、代碼實現(xiàn)
實體:
public class User implements Serializable {
private Long id;
private String name;
private String phone;
private String email;
.....
}
Controller:
@RestController
@RequestMapping("test")
public class TestController {
// TODO DEMO配置文件中,存在多種配置策略,如何只需要對某一種類型進行測試,則需要修改配置文件配置
@Resource
private TestService testService;
@GetMapping("/read/write")
public Object dataReadWrite() {
return testService.dataReadWrite();
}
}
Service:
@Service
public class TestService {
@Resource
private MasterSlaveMapper masterSlaveMapper;
public Object dataReadWrite() {
// 插入
User user = new User();
user.setId(1L);
user.setName("Name");
user.setPhone("phone");
user.setEmail("email");
masterSlaveMapper.insertMasterSlave(user);
// 修改
masterSlaveMapper.updateMasterSlaveById(1L, "修改名稱");
// 刪除
masterSlaveMapper.deleteMasterSlaveById(2L);
// 查詢
List<User> users = masterSlaveMapper.listAllMasterSlave();
return users;
}
}
Mapper
@Mapper
public interface MasterSlaveMapper {
int insertMasterSlave(User user);
int deleteMasterSlaveById(Long id);
int updateMasterSlaveById(@Param("id") Long id, @Param("name") String name);
List<User> listAllMasterSlave();
}
Mapping
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lhz.sharding.mapper.MasterSlaveMapper">
<insert id="insertMasterSlave" parameterType="com.lhz.sharding.model.entity.User">
insert into user(id, name, phone, email)
values (#{id}, #{name}, #{phone}, #{email})
</insert>
<delete id="deleteMasterSlaveById">
delete
from user
where id = #{id}
</delete>
<update id="updateMasterSlaveById">
update
user
set `name` = #{name}
where id = #{id}
</update>
<select id="listAllMasterSlave"
resultType="com.lhz.sharding.model.entity.User">
select *
from user
order by id desc
</select>
</mapper>
4、效果:
根據(jù)properties的配置內(nèi)容,ds0對于3306端口的主庫,ds1對于3306端口的從庫,以下運行截圖可以看到,新增、修改、刪除操作的ds0(主庫),查詢操作的ds1(從庫),所以Sharding-JDBC會字段根據(jù)SQL語義自動區(qū)分是操作主庫還是從庫。
新增、修改、刪除:

查詢:

總結
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
spring實現(xiàn)靜態(tài)注入(類或者屬性)操作示例
這篇文章主要為大家介紹了spring實現(xiàn)靜態(tài)注入(類或者屬性)操作示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-07-07
如何獲取MyBatis Plus執(zhí)行的完整的SQL語句
這篇文章主要介紹了如何獲取MyBatis Plus執(zhí)行的完整的SQL語句問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-07-07
連續(xù)調(diào)用多個外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路
今天小編就為大家分享一篇關于連續(xù)調(diào)用多個外部系統(tǒng)寫接口保證數(shù)據(jù)一致性的思路,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧2018-12-12
Java實現(xiàn)Kafka生產(chǎn)者和消費者的示例
這篇文章主要介紹了Java實現(xiàn)Kafka生產(chǎn)者和消費者的示例,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2021-02-02

