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

  • 相关阅读:
    【转】CRC校验
    【转】MapReduce程序的工作过程
    【转】hadoop机架感知
    【转】git常用命令
    Code Examples for scala actor link
    【转】ThreadLocal原理及其实际应用
    【转】scala解惑: 偏函数与部分应用函数
    (九)Maven坐标详解
    (八)Eclipse创建Maven项目运行mvn命令
    (七)Maven使用的最佳实践
  • 原文地址:https://www.cnblogs.com/mushishi/p/15022093.html
Copyright © 2011-2022 走看看