阿飞Javaer,转载请注明原创出处,谢谢!
读写分离支持项
- 提供了一主多从的读写分离配置,可独立使用,也可配合分库分表使用。
- 同一线程且同一数据库连接内,如有写入操作,以后的读操作均从主库读取,用于保证数据一致性。
- Spring命名空间。
- 基于Hint的强制主库路由。
读写分离不支持范围
- 主库和从库的数据同步。
- 主库和从库的数据同步延迟导致的数据不一致。
- 主库双写或多写。
读写分离支持项和不支持范围摘自 sharding-jdbc使用指南☞读写分离
源码分析
先执行sharding-jdbc-example-config-spring-masterslave
模块中的的SQL脚本all_schema.sql
,这里有读写分离测试的需要的数据库、表以及数据;
- 两个主数据库dbtbl_0_master
和dbtbl_1_master
;
- 数据库dbtbl_0_master
有两个从库dbtbl_0_slave_0
和dbtbl_0_slave_1
,这个集群命名为dbtbl_0
;
- 数据库dbtbl_1_master
有两个从库dbtbl_1_slave_0
和dbtbl_1_slave_1
,这个集群命名为dbtbl_1
;
对应的xml配置如下:
<rdb:master-slave-data-source id="dbtbl_0" master-data-source-ref="dbtbl_0_master" slave-data-sources-ref="dbtbl_0_slave_0, dbtbl_0_slave_1" />
<rdb:master-slave-data-source id="dbtbl_1" master-data-source-ref="dbtbl_1_master" slave-data-sources-ref="dbtbl_1_slave_0, dbtbl_1_slave_1" />
以SpringNamespaceWithMasterSlaveMain.java
为入口,分析读写分离是如何实现的:
router()路由时,会尝试读写分离:
Collection<PreparedStatement> preparedStatements;
if (SQLType.DDL == sqlType) {
// 路由这里生成PreparedStatement时会选主从(如果是主从的话)
preparedStatements = generatePreparedStatementForDDL(each);
} else {