代理模式实现数据库读写分离,核心是代理对象统一接收请求并按读/写类型分发至主从库,通过统一接口规范、动态选库逻辑、工厂与连接池管理及延迟应对机制,在不侵入业务代码前提下完成解耦与扩展。

代理模式实现数据库读写分离,核心是让代理对象统一接收请求,再按操作类型(读/写)分发到不同数据源。它不改变业务调用方式,只在中间加一层路由逻辑,既符合开闭原则,又避免应用层硬编码主从细节。
定义统一接口规范
所有数据库操作必须通过一个标准接口暴露,比如:
- 接口中明确声明读方法(如 getById()、list())和写方法(如 save()、update())
- 接口不关心具体连接哪个库,只约定行为契约
- 后续新增从库或切换策略时,只需改代理实现,无需动业务代码
代理类按请求类型动态选库
代理类实现该接口,在方法内部判断操作性质,调用对应数据源:
-
写操作(INSERT/UPDATE/DELETE)→ 获取主库连接(如
Factory::getDatabase('master')) -
读操作(SELECT)→ 获取从库连接(如
Factory::getDatabase('slave')) - 可进一步扩展:按从库负载、延时、权重做轮询或一致性哈希分发
配合工厂与连接池管理
代理本身不创建连接,而是委托给工厂或连接池:
- 工厂根据参数('master' 或 'slave')返回对应配置的数据库实例
- 连接池按角色隔离:主库池支持事务和写性能优化,从库池侧重并发读取和空闲复用
- 避免代理成为瓶颈,连接获取应轻量、线程安全
处理数据延迟与强制读主场景
主从同步存在延迟,某些业务需立刻读到刚写入的数据:
- 提供强制路由机制,例如在方法调用前设置上下文标识:
Context.setRouteToMaster(true) - 代理检测该标识后,跳过从库选择逻辑,直接走主库执行查询
- 也可通过注解(如
@ReadFromMaster)+ AOP 自动注入路由策略


















