SingleDataSource#initDataSourceOrigin -> this.dataSourcePool.build
构建底层数据库连接池的时候,如果创建失败会直接抛出一个异常 ,初始化状态不会置为 true,如下
throw new ZebraConfigException(String.format("HikariCP dataSource [%s] created error : ", config.getId()), e);
如果配置的不是懒加载,则会直接去获取下连接 getConnectionOrigin() 来触发底层连接池的初始化 ,这个时候连接建立失败 则抛出底层数据库连接池的内部异常,不会执行到 init=true 这行代码,连接池处于未初始化状态,下次再 getConnection 的时候会再次去初始化
当配置发生变化的时候, GroupDataSource 会重建内部的 SingleDataSource
// create new newMaster = this.dataSourceManager.createDataSource(config, this.filters); // switch first SingleDataSource oldMaster = master; this.master = newMaster; this.configs = newFailoverConfig; // close after this.dataSourceManager.destoryDataSource(oldMaster);
它是先构建新SingleDataSource 然后替换旧的,也就是说如果新的构建失败, 则不会走到替换的步骤,继续使用老数据源
默认底层连接池是懒加载的, 只是构建了底层连接池的对象实例, 不会去执行初始化(获取连接) 的操作,这一步不会失败;等实际要执行sql的时候,获取连接超时失败的话,下次再次重试就好了
如果 lazyInit 设置为 false, 就有可能导致配置更新了,但是由于新数据源构建后初始化失败而没有替换掉老的