在初始化 GroupDataSource 的時(shí)候,會(huì)往它的配置管理器 DefaultDataSourceConfigManager中添加了一個(gè)配置監(jiān)聽(tīng)器
代碼路徑:GroupDataSource#init() -> initConfig();
this.dataSourceConfigManager.addListerner(new GroupDataSourceConfigChangedListener());
public class GroupDataSourceConfigChangedListener implements PropertyChangeListener {
@Override
public synchronized void propertyChange(PropertyChangeEvent evt) {
**refresh**(evt.getPropertyName());
}
}
在監(jiān)聽(tīng)到配置變更(zk或http)的時(shí)候,會(huì)調(diào)用分組ds內(nèi)部的 GroupDataSource#refresh 方法進(jìn)行刷新


參考 分組GroupDataSource及其初始化 中初始化的寫庫(kù)和讀庫(kù)的 ds 類型
- 刷新寫庫(kù)
writeDataSource#refresh (FailOverDataSource#refresh)篩選配置中的第一個(gè)寫庫(kù),新建SingleDataSource 替換掉老的,然后銷毀老的sds - 刷新讀庫(kù)
readDataSource#refresh (LoadBalanceDataSource#refresh) - 篩選配置中的所有讀庫(kù),新建SingleDataSource 替換掉老的,然后銷毀老的sds
一般是直接重建底層 DataSource連接池 ,不然要根據(jù)底層數(shù)據(jù)庫(kù)連接池的支持情況來(lái) 更新單個(gè)屬性,這樣適配起來(lái)就會(huì)非常的繁瑣, 而這種db配置變更本身是非常低頻或者在故障的時(shí)候急救措施, 重建 DataSource 期間少許的報(bào)錯(cuò)也可以接受
除了這個(gè)實(shí)時(shí)的配置更新之外,還有一個(gè) DataSourceConfigRefresh 每隔1分鐘,檢查一次group分組和分組內(nèi)single的配置是否發(fā)生變化; 這樣就避免了 配置更新的時(shí)候由于網(wǎng)絡(luò)異常等原因 數(shù)據(jù)源刷新失敗
zebra 只支持整個(gè)GroupDataSource 粒度的配置刷新,沒(méi)有單獨(dú)刷新 SingleDataSource配置, 不能單獨(dú)調(diào)整連接池的配置
如果讀寫分離中其中一個(gè)db節(jié)點(diǎn)故障,要切換成備份節(jié)點(diǎn),這個(gè)時(shí)候 zebra就只能整體變動(dòng)整個(gè)Group分組,切換會(huì)比較費(fèi)時(shí); 個(gè)人覺(jué)得還是需要支持單個(gè) db節(jié)點(diǎn)(SingleDataSouce)的配置變更,方便故障切換