• 周一. 8月 15th, 2022

5G编程聚合网

5G时代下一个聚合的编程学习网

热门标签

[zebra源码]SingleDataSource构建和初始化

admin

11月 28, 2021

SingleDataSource 对应 GroupDataSource 主库节点 或一个从库节点

由于它是对应的是实际的db节点,直接和底层数据库连接池打交道; zebra 将它的生命周期交由 SingleDataSourceManager 进行管理,负责构建、启停、销毁, 销毁的过程是异步的,先将其塞到阻塞队列 BlockingQueue<SingleDataSource> toBeClosedDataSource 中,有一个监控线程每隔100ms从队列中取出待关闭的ds 关闭之 (这个或许有助于配置变更时加快 GroupDataSource 的重建)

SingleDataSource的构建和初始化

SingleDataSourceManager#createDataSource()

-> initDataSourceWithFilters()

-> initDataSourceOrigin()

(1) 构建SingleDataSource对象: SingleDataSourceManager#createDataSource()

// internal use only
	public SingleDataSource(DataSourceConfig config, List<JdbcFilter> filters) {
		this.datasourceId = config.getId();
		this.config = config;
		this.punisher = new CountPunisher(this, config.getTimeWindow(), config.getPunishLimit());
		this.filters = filters;
		this.poolType = config.getType();
		// 懒加载
		this.lazyInit = config.isLazyInit();
		this.withDefalutValue = true;
		this.forceClose = false;
		// 根据配置构建对应的底层数据库连接池 
		this.dataSourcePool = DataSourcePoolFactory.buildDataSourcePool(config);

		initDataSourceWithFilters(config);
	}

this.poolType: 连接池类型,如 hikaricp、druid

this.lazyInit:   是否惰性初始化,默认是true, 底层连接池真正初始化的时候 会直接初始化 initialSize个物理连接,过程较慢, 如果为false 那么会影响应用启动时间

this.dataSourcePool: 对底层连接池的包装类, 根据 poolType 初始化对应的类型

DataSourcePool 的定义

image.png

DataSourcePool 实现类则对应各种连接池,命名规则为 xxDataSourcePool

image.png

以目前最快的连接池 hikariCP为例,适配类为 HikariDataSourcePool, #build() 返回 HikariDataSource 对象

(2) 初始化 initDataSourceWithFilters() -> initDataSourceOrigin()

initDataSourceWithFilters() 看名字,依旧是先执行以下自定义的 jdbcFilter 当前生命周期的过滤器方法 jdbcFilter#initDataSourceOrigin()

(3) initDataSourceOrigin() 初始化底层连接池

image.png

  1. DataSource result = this.dataSourcePool.build(value, withDefalutValue); 构建底层连接池对象, 如hikariCp的 HikariCPDataSource、 druid的DruidDataSource
  2. 初始化连接 如果非惰性初始化 this.lazyInit = false(默认是true) 的话才调用 getConnection() 让底层连接池进行初始化, 否则的话不执行;

底层连接池一般是在第一次获取连接的时候,进行初始化操作 如一次性初始化 initialSize 个物理连接,这个过程比较慢,不建议设为false

SindleDataSource#close()

当SingleDataSource#close 的时候,会一起关闭内部的 DataSourcePool 进而把底层的 连接池给关闭了

完整目录:数据库中间件zebra源码分析

本文来自博客园,作者:mushishi,转载请注明原文链接:https://www.cnblogs.com/mushishi/p/15022079.html

发表回复

您的电子邮箱地址不会被公开。