Java教程

[zebra源码]如果数据库连接建立失败会怎样

本文主要是介绍[zebra源码]如果数据库连接建立失败会怎样,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

如果数据库连接首次建立失败,会怎么样?

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, 就有可能导致配置更新了,但是由于新数据源构建后初始化失败而没有替换掉老的

这篇关于[zebra源码]如果数据库连接建立失败会怎样的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!