/**
   * 刷新数据源
   *
   * @param newConfig
   */
  private void reflush(DataSourceConfig newConfig) {
    // 本地配置优先
    overByLocal(newConfig);

    try {
      _ds_lock_.lock();
      if (null == config
          || (config.getDbStatus() == DBStatus.NA_STATUS
              && newConfig.getDbStatus() != DBStatus.NA_STATUS)) {
        // 创建数据源
        localTxDataSource =
            IDataSourceFactory.createLocalTxDataSource(
                dataSourceConfig2LocalTxDataSourceConfig(newConfig));
        logger.warn("Init datasource");
      } else if (config.getDbStatus() != DBStatus.NA_STATUS
          && newConfig.getDbStatus() == DBStatus.NA_STATUS) {
        // 销毁数据源
        destroy();
        logger.warn("Destroy datasource");
      } else {
        // 刷新
        if (isNeedFlush(config, newConfig)) {
          LocalTxDataSourceConfig c = dataSourceConfig2LocalTxDataSourceConfig(newConfig);
          localTxDataSource.setConnectionURL(c.getConnectionURL());
          localTxDataSource.setDriverClass(c.getDriverClassName());
          localTxDataSource.setExceptionSorterClassName(c.getExceptionSorterClassName());
          flush();
        }
      }

      config = newConfig;
      dbType = config.getDbType();
    } catch (Exception e) {
      logger.error(e);
    } finally {
      _ds_lock_.unlock();
    }
  }
  @Override
  protected DataSource getDataSource() throws SQLException {
    if (null == wrapDataSource) {
      try {
        String errorMsg = null;
        _ds_lock_.lock();
        if (null != wrapDataSource) {
          return wrapDataSource;
        }

        if (null == localTxDataSource) {
          errorMsg = "DynamicAtomDataSource maybe not inited";
          logger.error(errorMsg);
          throw new SQLException(errorMsg);
        }

        DataSource ds = localTxDataSource.getDatasource();
        if (null == ds) {
          errorMsg = "DynamicAtomDataSource maybe not inited";
          logger.error(errorMsg);
          throw new SQLException(errorMsg);
        }

        DBStatus status = config.getDbStatus();
        if (null == status || status == DBStatus.NA_STATUS) {
          errorMsg = "DynamicAtomDataSource database status unknown";
          logger.error(errorMsg);
          throw new SQLException(errorMsg);
        }

        AtomDataSourceWrapper newds =
            new AtomDataSourceWrapper(localTxDataSource.getDatasource(), config);
        wrapDataSource = newds;
        return wrapDataSource;
      } finally {
        _ds_lock_.unlock();
      }
    } else {
      return wrapDataSource;
    }
  }
  /**
   * @param dsConfig
   * @return
   */
  private LocalTxDataSourceConfig dataSourceConfig2LocalTxDataSourceConfig(
      DataSourceConfig dsConfig) {
    LocalTxDataSourceConfig config = new LocalTxDataSourceConfig();
    config.setJndiName(dsConfig.getDbName());
    config.setUserName(dsConfig.getUserName());
    config.setPassword(dsConfig.getPassword());
    config.setDriverClassName(dsConfig.getDriverClassName());
    config.setExceptionSorterClassName(dsConfig.getSorterClassName());
    if (dsConfig.getDbType() == DBType.MYSQL) {
      String connectionURL =
          DBCononectionURLTool.getMySqlConnectionURL(
              dsConfig.getIp(),
              dsConfig.getPort(),
              dsConfig.getDbName(),
              dsConfig.getConnectionProperties());
      config.setConnectionURL(connectionURL);
      // 如果可以找到mysql driver中的Valid就使用,否则不设置valid
      try {
        Class validClass = Class.forName(DBConstants.DEFAULT_MYSQL_VALID_CONNECTION_CHECKERCLASS);
        if (null != validClass) {
          config.setValidConnectionCheckerClassName(
              DBConstants.DEFAULT_MYSQL_VALID_CONNECTION_CHECKERCLASS);
        } else {
          logger.warn(
              "MYSQL Driver is Not Suport "
                  + DBConstants.DEFAULT_MYSQL_VALID_CONNECTION_CHECKERCLASS);
        }
      } catch (ClassNotFoundException e) {
        logger.warn(
            "MYSQL Driver is Not Suport "
                + DBConstants.DEFAULT_MYSQL_VALID_CONNECTION_CHECKERCLASS);
      } catch (NoClassDefFoundError e) {
        logger.warn(
            "MYSQL Driver is Not Suport "
                + DBConstants.DEFAULT_MYSQL_VALID_CONNECTION_CHECKERCLASS);
      }

      // 如果可以找到mysqlDriver中的integrationSorter就使用否则使用默认的
      try {
        Class integrationSorterCalss = Class.forName(DBConstants.MYSQL_INTEGRATION_SORTER_CLASS);
        if (null != integrationSorterCalss) {
          config.setExceptionSorterClassName(DBConstants.MYSQL_INTEGRATION_SORTER_CLASS);
        } else {
          config.setExceptionSorterClassName(DBConstants.DEFAULT_MYSQL_SORTER_CLASS);
          logger.warn(
              "MYSQL Driver is Not Suport "
                  + DBConstants.MYSQL_INTEGRATION_SORTER_CLASS
                  + " use default sorter "
                  + DBConstants.DEFAULT_MYSQL_SORTER_CLASS);
        }
      } catch (ClassNotFoundException e) {
        logger.warn(
            "MYSQL Driver is Not Suport "
                + DBConstants.MYSQL_INTEGRATION_SORTER_CLASS
                + " use default sorter "
                + DBConstants.DEFAULT_MYSQL_SORTER_CLASS);
      } catch (NoClassDefFoundError e) {
        logger.warn(
            "MYSQL Driver is Not Suport "
                + DBConstants.MYSQL_INTEGRATION_SORTER_CLASS
                + " use default sorter "
                + DBConstants.DEFAULT_MYSQL_SORTER_CLASS);
      }
    } else if (dsConfig.getDbType() == DBType.ORACLE) {
      String connectionURL =
          DBCononectionURLTool.getOracleConnectionURL(
              dsConfig.getIp(),
              dsConfig.getPort(),
              dsConfig.getDbName(),
              dsConfig.getOracleConnectionType());
      config.setConnectionURL(connectionURL);
      // 如果是oracle没有设置ConnectionProperties则给以个默认的
      if (!dsConfig.getConnectionProperties().isEmpty()) {
        config.setConnectionProperties(dsConfig.getConnectionProperties());
      } else {
        config.setConnectionProperties(DBConstants.DEFAULT_ORACLE_CONNECTION_PROPERTIES);
      }
    }

    config.setMinPoolSize(dsConfig.getMinPoolSize());
    config.setMaxPoolSize(dsConfig.getMaxPoolSize());
    config.setPreparedStatementCacheSize(dsConfig.getPreparedStatementCacheSize());
    if (dsConfig.getIdleTimeout() > 0) {
      config.setIdleTimeoutMinutes(dsConfig.getIdleTimeout());
    }
    if (dsConfig.getBlockingTimeout() > 0) {
      config.setBlockingTimeoutMillis(dsConfig.getBlockingTimeout());
    }
    return config;
  }
 /**
  * 优先使用本地配置
  *
  * @param config
  */
 private void overByLocal(DataSourceConfig config) {
   if (null == config || null == localConfig) {
     return;
   }
   if (StringUtil.isNotBlank(localConfig.getDriverClassName())) {
     config.setDriverClassName(localConfig.getDriverClassName());
   }
   if (StringUtil.isNotBlank(localConfig.getSorterClassName())) {
     config.setSorterClassName(localConfig.getSorterClassName());
   }
   if (StringUtil.isNotBlank(localConfig.getPassword())) {
     config.setPassword(localConfig.getPassword());
   }
   if (null != localConfig.getConnectionProperties()
       && !localConfig.getConnectionProperties().isEmpty()) {
     config.setConnectionProperties(localConfig.getConnectionProperties());
   }
 }