zoukankan      html  css  js  c++  java
  • [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源码分析

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

  • 相关阅读:
    Android TextView中实现点击文本超链接(无下划线)的封装类
    first day for new job
    配置Log4j(非常具体)
    验证数字的正则表达式集
    虚拟化知识点
    Java实现第十届蓝桥杯数的分解
    Java实现第十届蓝桥杯数的分解
    Java实现第十届蓝桥杯数的分解
    Java实现第十届蓝桥杯数列求值
    Java实现第十届蓝桥杯数列求值
  • 原文地址:https://www.cnblogs.com/mushishi/p/15022093.html
Copyright © 2011-2022 走看看