zoukankan      html  css  js  c++  java
  • [zebra源码]SingleDataSource构建和初始化

    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

  • 相关阅读:
    生成测试报告unittest、HTMLTestRunner(pytest、allure)
    接口自动化上传视频(python)
    Android手机测试环境搭建
    jmeter性能测试监控
    jmeter多机联合负载
    jenkins+ant+jmeter接口自动化的持续集成
    jmeter+jenkins 配置过程(很详细)
    XSS攻击测试代码
    web安全测试之 xss攻击
    互联网公司--高级测试工程师面试经验分享
  • 原文地址:https://www.cnblogs.com/mushishi/p/15022079.html
Copyright © 2011-2022 走看看