第六章:Sharding-JDBC 读写分离

mac2026-01-12  7

Sharding-JDBC 读写分离

理解读写分离 面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善通过一主多从的配置方式,可以将查询请求均匀的分散到多个数据副本,能够进一步的提升系统的处理能力 使用多主多从的方式,不但能够提升系统的吞吐量,还能够提升系统的可用性,可以达到在任何一个数据库宕机,甚至磁盘物理损坏的情况下仍然不影响系统的正常运行 Sharding-JDBC读写分离 Sharding-JDBC读写分离则根据SQL语义的分析,将读操作和写操作分别路由至主库与从库它提供透明化读写分离,让使用方尽量像使用一个数据库一样使用主从数据库集群 Sharding-JDBC读写分离配置案例

MySQL 主从同步配置

参考MySQL主从同步配置文档

Sharding-jdbc读写分离配置

# sharding-jdbc 读写分离配置 # 数据源 spring.shardingsphere.datasource.names = master,slave0 spring.shardingsphere.datasource.master.type = com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.master.driver-class-name = com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.master.jdbcUrl = jdbc:mysql://127.0.0.1:3306/master_order?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false spring.shardingsphere.datasource.master.username = root spring.shardingsphere.datasource.master.password = spring.shardingsphere.datasource.slave0.type = com.zaxxer.hikari.HikariDataSource spring.shardingsphere.datasource.slave0.driver-class-name = com.mysql.cj.jdbc.Driver spring.shardingsphere.datasource.slave0.jdbcUrl = jdbc:mysql://127.0.0.1:3306/slave_order?serverTimezone=Asia/Shanghai&characterEncoding=utf8&useUnicode=true&useSSL=false spring.shardingsphere.datasource.slave0.username = root spring.shardingsphere.datasource.slave0.password = # 指明sharding-jdbc数据源ds0的主从数据源配置 spring.shardingsphere.sharding.master-slave-rules.ds0.master-data-source-name = master spring.shardingsphere.sharding.master-slave-rules.ds0.slave-data-source-names = slave0 # 指定t_order表的主键生成策略为SNOWFLAKE spring.shardingsphere.sharding.tables.t_order.key-generator.column = order_id spring.shardingsphere.sharding.tables.t_order.key-generator.type = SNOWFLAKE # 打开sql输出日志 spring.shardingsphere.props.sql.show = true

代码及测试

@Test public void testSelectByPrimaryKey() { Order order = orderDao.selectByPrimaryKey(393883632147628033L); System.out.println("order = " + order); }

日志信息

[main] INFO ShardingSphere-SQL - Actual SQL: slave0 ::: SELECT order_id, price, user_id, status FROM t_order WHERE order_id = ? ::: [393883632147628033] 通过日志可以看出,所有查操作落入slave0数据源
最新回复(0)