mysql主从复制是读写分离的前提,java应用不参与复制配置,仅通过shardingsphere-jdbc、abstractroutingdatasource或代理中间件实现sql路由,将写操作发往主库、读操作分发至从库。

Java 应用本身不直接配置 MySQL 主从复制,而是依赖数据库层完成主从搭建后,在 Java 侧通过连接管理或中间件实现读写分离。核心分两步:先由运维或 DBA 完成 MySQL 主从复制部署;再在 Java 应用中按需路由读/写请求。
一、MySQL 层必须先完成主从复制
这是读写分离的前提,Java 不参与此过程,但需确认以下配置已生效:
-
主库(Master)开启 binlog:在
/etc/my.cnf中配置log-bin=mysql-bin和唯一server-id=1 -
从库(Slave)配置唯一 server-id(如
server-id=2),并启用relay_log,建议加上read_only=1防误写 -
创建复制账号:主库执行
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%' IDENTIFIED BY 'SecurePass123!'; FLUSH PRIVILEGES; -
从库执行 CHANGE REPLICATION SOURCE TO,指定主库地址、日志文件名(
SOURCE_LOG_FILE)和位置(SOURCE_LOG_POS),该信息来自主库的SHOW MASTER STATUS; -
启动复制并验证:从库运行
START REPLICA;,再执行SHOW REPLICA STATUS\G,确认Replica_IO_Running和Replica_SQL_Running均为 Yes
二、Java 应用层实现读写分离
有三种主流方式,按推荐度排序:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
-
ShardingSphere-JDBC(推荐):轻量级 Java Agent,无需改 SQL。引入依赖后,在
application.yml中声明主库和多个从库数据源,配置读写分离规则。框架自动将SELECT路由到从库,INSERT/UPDATE/DELETE走主库 -
Spring Boot + AbstractRoutingDataSource:自定义动态数据源,重写
determineCurrentLookupKey()方法,结合 AOP 或注解(如@ReadOnly)识别读操作,手动切换数据源 - 代理中间件(如 MaxScale、ProxySQL):部署独立代理服务,Java 应用只连代理地址。代理根据 SQL 类型自动分发至后端主/从节点,对应用完全透明
三、关键注意事项
避免踩坑,重点关注这些细节:
-
主从延迟影响一致性:写完立刻读可能查不到最新数据。敏感场景(如订单支付后查状态)应强制走主库,可用
/*+ FORCE_MASTER */注释或临时切换数据源 -
事务内必须走主库:Spring 的
@Transactional方法中所有 SQL(包括 SELECT)都应落在主库,否则会报错或数据异常 -
从库只读设置不是绝对安全:
read_only=1对 super 权限用户无效,务必限制高权限账号使用范围 - 连接池需分别配置:主库和从库要用不同的 HikariCP 或 Druid 数据源,避免连接复用导致路由混乱
整个链路是:MySQL 主从复制保障数据同步 → Java 框架或中间件识别语句类型 → 写请求打向主库、读请求均衡分发至从库 → 应用无感获得更高并发读能力。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










