当前位置:网站首页>七、HikariConfig初始化分析
七、HikariConfig初始化分析
2022-07-29 21:41:00 【InfoQ】
欢迎访问我的博客,同步更新:
枫山别院
源代码版本2.4.5-SNAPSHOT
HikariConfig有 3 个构造方法,这三个构造方法其实都差不多,无我们逐个看一下:
无参构造
第一个无参的构造,代码如下:
public HikariConfig() {
dataSourceProperties = new Properties();
healthCheckProperties = new Properties();
//①
minIdle = -1;
maxPoolSize = -1;
maxLifetime = MAX_LIFETIME;
connectionTimeout = CONNECTION_TIMEOUT;
validationTimeout = VALIDATION_TIMEOUT;
idleTimeout = IDLE_TIMEOUT;
isAutoCommit = true;
isInitializationFailFast = true;
//②
String systemProp = System.getProperty("hikaricp.configurationFile");
if (systemProp != null) {
loadProperties(systemProp);
}
}
- ①初始化默认值
初始化默认值这部分,这些参数我们在《HikariConfig的配置解析》一文中都解析过这些参数,略过不提。
- ②获取配置文件地址
在这里首先尝试获取key 是
hikaricp.configurationFile的配置文件地址,如果用户配置了,就会加载。我们可以在启动应用的时候使用
-D指定。
我们详细看下
loadProperties方法:
protected void loadProperties(String propertyFileName) {
//①将propertyFileName当作一个路径, 直接加载文件
final File propFile = new File(propertyFileName);
//②判断propFile是一个文件, 就直接读取; 不是文件, 就继续查找, 加载不到, 直接报错
try (final InputStream is = propFile.isFile() ? new FileInputStream(propFile) : this.getClass().getResourceAsStream(propertyFileName)) {
if (is != null) {
Properties props = new Properties();
props.load(is);
//③
PropertyElf.setTargetFromProperties(this, props);
} else {
throw new IllegalArgumentException("Cannot find property file: " + propertyFileName);
}
} catch (IOException io) {
throw new RuntimeException("Failed to read property file", io);
}
}
- ①加载文件
尝试将propertyFileName当作一个路径, 直接加载文件
- ②查找文件
在此判断propFile是不是一个文件, 是文件就直接读取; 不是文件, 就继续查找。如果最后还是 加载不到, 直接直接报错。
- ③获取属性
将Properties文件中的配置,取出来 set 到
HikariConfig中。
配置赋值
我们看下实现:
public static void setTargetFromProperties(final Object target, final Properties properties) {
if (target == null || properties == null) {
return;
}
//①获取HikariConfig中的所有方法
List<Method> methods = Arrays.asList(target.getClass().getMethods());
//获取properties配置文件的所有配置项名称的集合, 例如dataSource.username = tom , 此处拿到的是dataSource.username这种等号左边的所有配置项
Enumeration<?> propertyNames = properties.propertyNames();
//遍历所有的配置项, 复制到HikariConfig中
while (propertyNames.hasMoreElements()) {
Object key = propertyNames.nextElement();
String propName = key.toString();
//获取配置项对应的值
Object propValue = properties.getProperty(propName);
if (propValue == null) {
propValue = properties.get(key);
}
//②如果不是HikariConfig的配置, 是dataSource的配置, 也就是数据库相关的配置, 就添加到DataSourceProperty中
// 因为每个数据库的配置可能不一样, 所有没有 setter 方法
if (target instanceof HikariConfig && propName.startsWith("dataSource.")) {
((HikariConfig) target).addDataSourceProperty(propName.substring("dataSource.".length()), propValue);
} else {
//③如果不是 dataSource配置, 那就调用 setter 方法, 给HikariConfig赋值
setProperty(target, propName, propValue, methods);
}
}
}
在①处,通过反射获取到
HikariConfig的所有方法,然后获取properties文件中所以的 key 值,遍历properties文件中的 所有key,将配置项一项一项的设置到
HikariConfig中。
注释非常详细,但是要提醒大家的是,并不是所有的配置,HikariCP 都有对应的属性,有一些数据库独有的配置项,我们通常是使用
dataSource.XXX来配置的,所以如果在properties文件中有以
dataSource.开头的配置项,那么就是dataSource的配置,要放到
DataSourceProperty中,这些配置没有对应的 setter。③处的
setProperty方法,就是一个比较普通的反射方式赋值的实现,大家看一下就可以了。
边栏推荐
- linux install redis using script
- 【CVPR2022】A Unified Query-based Paradigm for Point Cloud Understanding
- GBASE 8s 用户标示与鉴别
- 容器网络硬核技术内幕 (25) 知微知彰,知柔知刚 (中)
- [HDLBits brush questions] Verilog Language (4) Procedures and More Verilog Features section
- 02-SDRAM:自动刷新
- 【AD】【持续更新ing】关于AD设计过程中一些小细节
- 结合布林线理解现货白银走势图的方法
- GBASE 8s 数据库的智能大对象备份
- 关于 golang 错误处理的一些优化想法
猜你喜欢
随机推荐
【板栗糖GIS】arcmap—标注太长,如何换行显示
给图片左上角加logo标识、左下角加时间和地址、地址到达指定长度换行
APM电机输出逻辑(Motors类详解)
[BUG]memset和成员初始化的先后顺序
B. Party(图论/暴力/顶点的度数)
小程序微信定位不准
【板栗糖GIS】wps—如何查看表格中的超链接
转:idea中language level设置
Add obsolete flag to pdf
【HDLBits 刷题】Verilog Language(4)Procedures 和 More Verilog Features 部分
Jenkins 如何玩转接口自动化测试?
VSCode 插件大全
华东师范大学副校长周傲英:数据赋能,从数据库到数据中台
容器网络硬核技术内幕 (小结-中)
在Ferora35中安装oracle-database-xe-21c
SwiftUI Apple App Store 发布App的初学者完整指南
HMS Core音频编辑服务音源分离与空间音频渲染,助力快速进入3D音频的世界
针对自动识别大麦网滑块验证码,提出解决方案,并进行分析、总结
结合布林线理解现货白银走势图的方法
【AD】【持续更新ing】关于AD设计过程中一些小细节









