如果数据库连接首次建立失败,会怎么样?
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, 就有可能导致配置更新了,但是由于新数据源构建后初始化失败而没有替换掉老的