2019独角兽企业重金招聘Python工程师标准>>>

本节,讲解

dataSource.init();

打断点在

stop in com.alibaba.druid.pool.DruidDataSource.init

好,开始研究代码

public void init() throws SQLException {// 首先确定没有initedif (inited) {return;}//继续处理//获取lockfinal ReentrantLock lock = this.lock;try {//尝试获取locklock.lockInterruptibly();} catch (InterruptedException e) {throw new SQLException("interrupt", e);}//boolean init = false;try {//再次check没有初始化过,有点类似于double checkif (inited) {return;}//////// main[1] print initStackTrace// initStackTrace =// "java.lang.Thread.getStackTrace(Thread.java:1556)// com.alibaba.druid.pool.DruidDataSource.init(DruidDataSource.java:637)// com.alibaba.druid.pool.DruidDataSourceFactory.config(DruidDataSourceFactory.java:376)// com.alibaba.druid.pool.DruidDataSourceFactory.createDataSource(DruidDataSourceFactory.java:154)// com.alibaba.druid.pool.DruidDataSourceFactory.createDataSource(DruidDataSourceFactory.java:144)// user.defined.MyDataSourceFactory.getDataSource(MyDataSourceFactory.java:24)// org.apache.ibatis.builder.xml.XMLConfigBuilder.environmentsElement(XMLConfigBuilder.java:428)// org.apache.ibatis.builder.xml.XMLConfigBuilder.parseConfiguration(XMLConfigBuilder.java:150)// org.apache.ibatis.builder.xml.XMLConfigBuilder.parse(XMLConfigBuilder.java:111)// org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:82)// org.apache.ibatis.session.SqlSessionFactoryBuilder.build(SqlSessionFactoryBuilder.java:65)// test.Test.main(Test.java:23)// "initStackTrace = Utils.toString(Thread.currentThread().getStackTrace());

继续执行

//获取本数据源的ID标志this.id = DruidDriver.createDataSourceId();if (this.id > 1) {//同1个JVM里可能有多个数据源,就有多个IDlong delta = (this.id - 1) * 100000;this.connectionIdSeed.addAndGet(delta);this.statementIdSeed.addAndGet(delta);this.resultSetIdSeed.addAndGet(delta);this.transactionIdSeed.addAndGet(delta);}

然后处理JDBC

// 处理urlif (this.jdbcUrl != null) {this.jdbcUrl = this.jdbcUrl.trim();//进去没做什么事情initFromWrapDriverUrl();}

接下来是插件机制,就是初始化了插件

然后是确定dbType

if (this.dbType == null || this.dbType.length() == 0) {this.dbType = JdbcUtils.getDbType(jdbcUrl, null);}

这个是根据url的前缀来做的。

======================================================

//构建connectPropertiesif (JdbcConstants.MYSQL.equals(this.dbType) || //JdbcConstants.MARIADB.equals(this.dbType)) {//boolean cacheServerConfigurationSet = false;if (this.connectProperties.containsKey("cacheServerConfiguration")) {cacheServerConfigurationSet = true;} else if (this.jdbcUrl.indexOf("cacheServerConfiguration") != -1) {cacheServerConfigurationSet = true;}if (cacheServerConfigurationSet) {this.connectProperties.put("cacheServerConfiguration", "true");}}
//简单的参数checkif (maxActive <= 0) {throw new IllegalArgumentException("illegal maxActive " + maxActive);}if (maxActive < minIdle) {throw new IllegalArgumentException("illegal maxActive " + maxActive);}if (getInitialSize() > maxActive) {throw new IllegalArgumentException("illegal initialSize " + this.initialSize + ", maxActive " + maxActive);}if (timeBetweenLogStatsMillis > 0 && useGlobalDataSourceStat) {throw new IllegalArgumentException("timeBetweenLogStatsMillis not support useGlobalDataSourceStat=true");}if (maxEvictableIdleTimeMillis < minEvictableIdleTimeMillis) {throw new SQLException("maxEvictableIdleTimeMillis must be grater than minEvictableIdleTimeMillis");}
// 处理driverClassif (this.driverClass != null) {this.driverClass = driverClass.trim();}////////什么都不做initFromSPIServiceLoader();
//确定driverClass创建实例if (this.driver == null) {if (this.driverClass == null || this.driverClass.isEmpty()) {this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);}if (MockDriver.class.getName().equals(driverClass)) {driver = MockDriver.instance;} else {driver = JdbcUtils.createDriver(driverClassLoader, driverClass);}} else {if (this.driverClass == null) {this.driverClass = driver.getClass().getName();}}
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.init(), line=718 bci=649
718             initCheck();main[1] step
>
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.initCheck(), line=942 bci=0
942         if (JdbcUtils.ORACLE.equals(this.dbType)) {main[1] next
>
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.initCheck(), line=955 bci=125
955         } else if (JdbcUtils.DB2.equals(dbType)) {main[1] next
>
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.initCheck(), line=958 bci=142
958     }

===========接下来,就是initExceptionSorter();   看看,怎么执行的。

private void initExceptionSorter() {//从这里开始if (exceptionSorter instanceof NullExceptionSorter) {if (driver instanceof MockDriver) {return;}} else if (this.exceptionSorter != null) {return;}String realDriverClassName = driver.getClass().getName();if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) //|| realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) {//处理这个this.exceptionSorter = new MySqlExceptionSorter();

---创建ConnectionChecker

private void initValidConnectionChecker() {//here//String realDriverClassName = driver.getClass().getName();if (realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER) //|| realDriverClassName.equals(JdbcConstants.MYSQL_DRIVER_6)) {//针对mysql创建this.validConnectionChecker = new MySqlValidConnectionChecker();} else if (realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER)|| realDriverClassName.equals(JdbcConstants.ORACLE_DRIVER2)) {this.validConnectionChecker = new OracleValidConnectionChecker();} else if (realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER)|| realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER_SQLJDBC4)|| realDriverClassName.equals(JdbcConstants.SQL_SERVER_DRIVER_JTDS)) {this.validConnectionChecker = new MSSQLValidConnectionChecker();} else if (realDriverClassName.equals(JdbcConstants.POSTGRESQL_DRIVER)) {this.validConnectionChecker = new PGValidConnectionChecker();}}
 public MySqlValidConnectionChecker(){try {clazz = Utils.loadClass("com.mysql.jdbc.MySQLConnection");if (clazz == null) {clazz = Utils.loadClass("com.mysql.cj.jdbc.ConnectionImpl");}if (clazz != null) {ping = clazz.getMethod("pingInternal", boolean.class, int.class);}if (ping != null) {usePingMethod = true;}} catch (Exception e) {LOG.warn("Cannot resolve com.mysql.jdbc.Connection.ping method.  Will use 'SELECT 1' instead.", e);}configFromProperties(System.getProperties());}

接着初始化QueryChecker

Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.validationQueryCheck(), line=912 bci=4
912         if (!(isTestOnBorrow() || isTestOnReturn() || isTestWhileIdle())) {main[1] step
>
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.validationQueryCheck(), line=916 bci=22
916         if (this.validConnectionChecker != null) {main[1] print validConnectionCheckervalidConnectionChecker = "com.alibaba.druid.pool.vendor.MySqlValidConnectionChecker@2d1ef81a"
main[1] step
>
Step completed: "thread=main", com.alibaba.druid.pool.DruidDataSource.validationQueryCheck(), line=917 bci=29
917             return;main[1] step

看来不需要创建了。

转载于:https://my.oschina.net/qiangzigege/blog/884024

Druid源码分析系列1:dataSource.init()的准备工作相关推荐

  1. MyBatis 源码分析系列文章导读

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  2. MyBatis 源码分析系列文章导读 1

    1.本文速览 本篇文章是我为接下来的 MyBatis 源码分析系列文章写的一个导读文章.本篇文章从 MyBatis 是什么(what),为什么要使用(why),以及如何使用(how)等三个角度进行了说 ...

  3. 菜鸟读jQuery 2.0.3 源码分析系列(1)

    原文链接在这里,作为一个菜鸟,我就一边读一边写 jQuery 2.0.3 源码分析系列 前面看着差不多了,看到下面一条(我是真菜鸟),推荐木有入门或者刚刚JS入门摸不着边的看看,大大们手下留情,想一起 ...

  4. jQuery源码分析系列

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 版本截止到2013.8.24 jQuery官方发布最新的的2.0.3为准 附上每一章的源码注释分析 :https://git ...

  5. MyBatis 源码分析系列文章合集

    1.简介 我从七月份开始阅读MyBatis源码,并在随后的40天内陆续更新了7篇文章.起初,我只是打算通过博客的形式进行分享.但在写作的过程中,发现要分析的代码太多,以至于文章篇幅特别大.在这7篇文章 ...

  6. Spring IOC 容器源码分析系列文章导读

    1. 简介 前一段时间,我学习了 Spring IOC 容器方面的源码,并写了数篇文章对此进行讲解.在写完 Spring IOC 容器源码分析系列文章中的最后一篇后,没敢懈怠,趁热打铁,花了3天时间阅 ...

  7. Spring IOC 容器源码分析系列文章导读 1

    1. 简介 Spring 是一个轻量级的企业级应用开发框架,于 2004 年由 Rod Johnson 发布了 1.0 版本.经过十几年的迭代,现在的 Spring 框架已经非常成熟了.Spring ...

  8. dubbo源码分析系列(1)扩展机制的实现

    1 系列目录 dubbo源码分析系列(1)扩展机制的实现 dubbo源码分析系列(2)服务的发布 dubbo源码分析系列(3)服务的引用 dubbo源码分析系列(4)dubbo通信设计 2 SPI扩展 ...

  9. idea 线程内存_Java线程池系列之-Java线程池底层源码分析系列(一)

    课程简介: 课程目标:通过本课程学习,深入理解Java线程池,提升自身技术能力与价值. 适用人群:具有Java多线程基础的人群,希望深入理解线程池底层原理的人群. 课程概述:多线程的异步执行方式,虽然 ...

最新文章

  1. 如何让一个应届毕业生快速成长?
  2. The Wide and Deep Learning Model(译文+Tensorlfow源码解析) 原创 2017年11月03日 22:14:47 标签: 深度学习 / 谷歌 / tensorf
  3. c++ vlc读取摄像头_Qt音视频开发1-vlc解码播放
  4. [BUUCTF-pwn]——jarvisoj_level4
  5. 【算法分析与设计】快速幂算法与快速幂取模算法
  6. 嵌入式开发板01---点亮LED
  7. WebService可以远程调试调用
  8. 从零开始学 Web 之 jQuery(二)获取和操作元素的属性
  9. 快速修改本機局域網IP信息
  10. 全国计算机vfp是什么,vfp是什么-你知VFP是什么东西吗?它是我们大学生必须上的计算机的一个章节的 爱问知识人...
  11. Feed流之微博系统设计
  12. 搜狗浏览器收藏夹在什么位置?搜狗浏览器收藏夹路径在哪?
  13. IE查看源文件重定向到 桌面的解决方法
  14. 中文主播也能海外带货!同声传译助直播类应用开拓海外市场
  15. latex 标题chapter section里的英文和数字不加粗
  16. /etc/security/limits.conf 详解与配置
  17. 利用空闲服务器搭建frps服务端-实现穿透代理
  18. 自己交社保的手机APP
  19. fopen函数和文件权限
  20. 会议录音转文字(PC版)

热门文章

  1. FineReport单行与数据库交互的方法
  2. saltstack的状态文件
  3. GitHub中watch、star、fork的作用
  4. Domino Web开发规则之二:DOMINO与开发相关的管理规范
  5. 三十五例网络故障排除方法
  6. python numpy矩阵索引_Numpy中的矩阵索引
  7. 【转载】负数的二进制
  8. [ci]jenkins server启动,通过jnlp的方式启动slave(容器模式)
  9. sublime-text3按tab跳出括号
  10. day63-webservice 01.cxf介绍