1. Sharding-Jdbc源碼探究-讀寫分離
1.1. 主入口
-
找到源碼入口
-
這一個類圍繞了springboot配置屬性的加載,加載了
spring.shardingsphere.datasource.names
配置的數據源,遍歷存儲到了Map容器 -
可以看到它還有個
@ConditionalOnProperty(prefix = "spring.shardingsphere", name = "enabled", havingValue = "true", matchIfMissing = true)
屬性,說明只要引用了sharing-jdbc的pom,默認就會直接初始化加載 -
此類總共負責加載4個屬性類
//分片屬性配置
private final SpringBootShardingRuleConfigurationProperties shardingProperties;
//主從屬性配置
private final SpringBootMasterSlaveRuleConfigurationProperties masterSlaveProperties;
//加密屬性配置
private final SpringBootEncryptRuleConfigurationProperties encryptProperties;
//額外屬性配置(比如sql是否打印)
private final SpringBootPropertiesConfigurationProperties propMapProperties;
經過該文件的查看,我們大概知道了配置屬性是從哪里加載的和加載的過程
1.2. props
主從配置中主從的屬性逗號理解,也好找到使用的地方,對props是在哪且如何使用的呢?
我找到了這個類:
是不是很熟悉sql.show
,沒錯這是官網例子中的sql顯示配置,全稱配置是spring.shardingsphere.props.sql.show = true
,說明了還有其它配置可以在這個類找到,比如最大線程數,最大請求連接數,是否簡單sql等等,可以自己看看,一般都是用默認值
1.3. 數據源分離
- 主從環境的,具體選擇哪個datasource呢?
選完數據源,之后就是在mybatis包里執行具體的解析查詢過程
1.4. sql.show
這里就看看sql.shows
是如何發揮作用的,緊接着上述類,進入route方法
在route包中對是否打印這個sql做了判斷,而參數的來源就是showSQL
,而這個參數什么時候填進來的呢?1.3的截圖顯示不完整整句的內容如下
masterSlaveRouter = new MasterSlaveRouter(connection.getMasterSlaveDataSource().getMasterSlaveRule(),
connection.getMasterSlaveDataSource().getShardingProperties().<Boolean>getValue(ShardingPropertiesConstant.SQL_SHOW));
明白了吧,在MasterSlaveRouter
類實例化的時候,通過ShardingPropertiesConstant.SQL_SHOW
注入進來了,而ShardingPropertiesConstant
這個類1.2的時候已經提到過了