druid1.2.8源码阅读:第三天

Druid阅读(二)Druid初始化 目录 1 寻找源码入手点 2 开始Druid初始化分析 1 寻找源码入手点 如何开始Druid源码的阅读,这不免是个头痛的问题? 呃呃呃...昨天我们已经搭建好了一个基于Spring boot的Druid的demo,那么今天不妨直接基于搭建的示例来瞧瞧如何入手? 启动Spring boot示例项目观察到,如下截图的输出日志,图中的红框处 再看自己工程的Druid配置,用spring.datasource做了一系列的配置(druid相关配置有问题,后面会做说明),然后配置了一个 spri 阅读详情

druid1.2.8源码阅读:第三天

一、创建连接

Connection connection = dataSource.getConnection();

在druid中,实际获取的是DruidPooledConnection。

1.1 init()方法

如果连接池已经初始化了,直接返回:

if (inited) {
    return;
}

加载数据库驱动:

根据传入的url判断,去加载哪种数据库驱动。

(1)JdbcUtils.getDbType

根据URL的前缀获取数据类型:比如DbType.mysql,“mysql”

if (this.dbTypeName == null || this.dbTypeName.length() == 0) {
    this.dbTypeName = JdbcUtils.getDbType(jdbcUrl, null);
}
(2)根据DbType设置cacheServerConfiguration

对于部分数据库,可以设置这个配置

            if (dbType == DbType.mysql
                    || dbType == DbType.mariadb
                    || dbType == DbType.oceanbase
                    || dbType == DbType.ads) {
                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");
                }
            }
(4)校验参数设置的是否正确
maxActive 连接池中最多支持多少个活动会话
  • maxActive必须大于0
  • maxActive不能小于minIdle的数值。(minIdle,回收空闲连接时,将保证至少有minIdle个连接)
  • maxActive 的值必须大于或等于initialSize的大小。(initialSize,启动程序时,在连接池中初始化多少个连接)
useGlobalDataSourceStat 为true的时候,timeBetweenLogStatsMillis 值不能大于0
  • useGlobalDataSourceStat :合并多个数据源的监控数据
  • timeBetweenLogStatsMillis :间隔多久将统计信息输出到日志
maxEvictableIdleTimeMillis 的值,不能小于minEvictableIdleTimeMillis的值
  • maxEvictableIdleTimeMillis:当连接池中只剩下最少连接数的时候(minIdle),这些线程空闲多久关闭。默认7小时。
  • minEvictableIdleTimeMillis:非最小连接数的空闲连接,被逐出数据库连接池的最小时间。
keepAlive 为true的时候,keepAliveBetweenTimeMillis的值必须大于timeBetweenEvictionRunsMillis
  • keepAlive 是否维护空闲连接有效
  • keepAliveBetweenTimeMillis 空闲连接空闲的开始时候,启动保活机制
  • timeBetweenEvictionRunsMillis 启动销毁空闲连接的时间周期
(5)initFromSPIServiceLoader()

如果loadSpifilterSkip 为true,就从再通过SPI加载过滤器。

(6)resolveDriver(); 加载数据库驱动
  • 如果driverClass参数为空,则根据jdbcUrl获取driverClass;

    获取的driverClass值就为com.mysql.cj.jdbc.Driver

    this.driverClass = JdbcUtils.getDriverClassName(this.jdbcUrl);
    
    • 如果jdbcUrl的前缀为jdbc:mysql:那么加载数据库驱动包

      mysql_driver_version_6 = Utils.loadClass("com.mysql.cj.jdbc.Driver") != null;
      // 内部: Class.forName(className);
      
  • 根据dirverClass创建驱动Driver

    ClassLoader contextLoader = Thread.currentThread().getContextClassLoader();
    Class<?> clazz = contextLoader.loadClass(driverClassName);
    Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
    
Class.forName(className);
Class<?> clazz = contextLoader.loadClass(driverClassName);
Driver driver = (Driver) clazz.getDeclaredConstructor().newInstance();
(7)initCheck();确实使用的是什么数据库

根据DbType设置类型:

isMySql = true;
(8)initExceptionSorter();
  • 如果exceptionSorter 是NullExceptionSorter类型,并且驱动是MockDriver类型,直接返回
  • 或者如果exceptionSorter 不为空,就返回

否则,根据真实的realDriverClassName值(比如:com.mysql.cj.jdbc.Driver)

this.exceptionSorter = new MySqlExceptionSorter();
(9)initValidConnectionChecker();

如果validConnectionChecker不为空,就返回。

否则,根据真实的realDriverClassName值(比如:com.mysql.cj.jdbc.Driver)

this.validConnectionChecker = new MySqlValidConnectionChecker();
// clazz = Utils.loadClass("com.mysql.jdbc.MySQLConnection");
(10)validationQueryCheck(); 打印了几条配置参数的日志

如果 validConnectionChecker 不为空,就返回;

(11)创建JdbcDataSourceStat
(12)数据库连接池中连接的转换数组定义
            connections = new DruidConnectionHolder[maxActive];
            //准备关闭的
            evictConnections = new DruidConnectionHolder[maxActive];
            // 
            keepAliveConnections = new DruidConnectionHolder[maxActive];
(13)当initialSize 大于0时,初始化连接
PhysicalConnectionInfo pyConnectInfo = createPhysicalConnection();
DruidConnectionHolder holder = new DruidConnectionHolder(this, pyConnectInfo);
connections[poolingCount++] = holder;
(14)createAndLogThread();

只有当timeBetweenLogStatsMillis的值大于0的时候,才会创建日志状态线程。

(15)createAndStartCreatorThread();
createConnectionThread = new CreateConnectionThread(threadName);
createConnectionThread.start();
// initedLatch.countDown();
(16)createAndStartDestroyThread()
destroyConnectionThread = new DestroyConnectionThread(threadName);
destroyConnectionThread.start();

####(17)initedLatch.await();等待15、16步执行完

(18)registerMbean();调用C++的方法
AccessController.doPrivileged

Java native方法以及JNI实践

[druid 源码解析]1基础环境搭建 druid目前是国内使用最广泛的数据库连接池,了解学习其源码无疑对我们的工作有很好处,这次源码学习主要是针对 druid 的核心功能 pool 进行分析,其中会附带讲解其他部分内容,好啦废话不多说,我们开始吧。登录的用户密码是我们在上面配置文件设置的。我们先看一下 filter这里,我们可以看出来有个 stat filter,这个就是我们 slow sql 拦截的 filter。学习一个源码项目,我们有几个切入点,首先是单元测试,然后就是 example 项目,我们先从一个简单的 example 开始。 阅读详情

相关推荐

Druid 1.2.8数据库连接池:优化、监控与实战

本文还有配套的精品资源,点击获取 简介:Druid是阿里巴巴开源的高性能数据库连接池,支持多种数据库,具有强大的监控和管理功能。1.2.8版本引入多项改进,提高性能和稳定性。包括优化连接池算法、监控数据库连接状态、支持SQL解析和提供过滤器机制。此版本也修复已知bug,改善对主流数据库的兼容性,并提供详尽文档。压缩包提供了Javadoc、运行库和源码文件,便于开发者学习和集...

weixin_30533301的博客 3065

springboot整合druid抛出dbType not support : null

环境说明 数据库:mysql 操作工具:mybatis,mybatis-plus,druid,P6Spy 问题查找 从错误直观分析是显示数据库类型不支持,为null,那为什么以前没用P6Spy不会出现这种情况,初步判断是P6Spy进行代理的时候出了问题,接着看错误代码显示是WallFilter出现了问题,那这个时候就好找了,直接进入到该类里面,发现以下代码 elseif(rawUrl.startsWith(“jdbc:mysql:”) || rawUrl.startsWith(“jdbc:cobar:”

二十一克阳光!的博客 3381

druid1.2.8 下载 数据库连接池

druid1.2.8 下载 数据库连接池

Druid源码分析(三)-- 初始化DataSource2

Druid源码分析(三)-- 初始化DataSource2Druid源码分析(三)-- 初始化DataSource2initSPI机制总结 Druid源码分析(三)-- 初始化DataSource2 init 昨天分析了init 函数的双重校验+锁,今天接着往下看源码 // DruidDataSource.java#init() // 获取堆栈信息 initStackTrace = Utils.toString(Thread.currentThread().getStackTrace()); // 创建数据

可惜没如果的博客 701

RKNN3588——YOLOv8的PT模型转RKNN模型

1. 首先克隆rknn修改后的ultralytics版本项目到本地主要是修改了源码的ultralytics/nn/modules/head.py和ultralytics/engine/exporter.py两个文件。2. 使用修改后的ultralytics对pt模型进行模型转换,此处的format=rknn代表支持rknn后续的转换,而不是用onnx,一定要注意!!!

张飞飞的博客 7177

stm32f103c8t6+esp8266在WiFi下通过手机控制外设

stm32f103c8t6+esp8266在WiFi下通过手机控制外设前言 前言 通过上一篇,介绍了esp8266的基本功能,这篇将用stm32c8t6配合esp8266进行数据交互,实现用手机通过无线的方式去控制外设、开关等;这里相当于把stm32作为上一篇的串口助手和esp8266进行通信; ...

weixin_45430735的博客 1万+

数据库连接池——Druid使用方法

数据库连接池 一个容器(集合)存放数据库连接的容器。当系统初始化好后,容器被创建,容器中会申请一些连接对象,当用户来访问数据库时,从容器中获取连接对象,用户访问完之后,会将连接对象归还容器。 使用数据库连接池的优点: 1.节约资源 2.访问高效 Druid数据库连接池技术具体实现方法(4步) 1.导入jar包 druid-1.2.8.jar 2.定义配置文件: properties配置文件中的内容 driverClassName = com.mysql.cj.jdbc.Driver url = jdbc:m

yangkkkkaaad的博客 1442

科研软件|Adobe Photoshop 2024 (PS 2024)

科研软件|Adobe Photoshop 2024 (PS 2024)

m0_55499682的博客 5516

druid1.2.8源码阅读:第一天

druid1.2.8源码阅读:第一天 文章目录druid1.2.8源码阅读:第一天一、背景二、在本地启动MySQL,并简单测试JDBC2.1 在本地启动MySQL2.2 JDK11 之后没有jre文件夹,手动生成jre文件夹2.3 简单测试JDBC三、druid1.2.8 的源码结构 一、背景 2022年5月7日,看到秦老师在群里发消息说要组织源码活动。我之前没有源码阅读的经历,为了让自己也具备源码阅读的经验,积极的参与的这次活动。 二、在本地启动MySQL,并简单测试JDBC 2.1 在本地启动M

hefrankeleyn的博客 410

注意力机制与经典 CV 网络:PyTorch 实现与实战

注意力机制(SE/空间/CBAM/Non-Local)通过权重重标定让模型聚焦关键特征,经典 CNN(ResNet/DenseNet/FPN)提供了深层网络、特征复用和多尺度融合的基础骨架。建议先在 ResNet 上插入 SE 模块(通道注意力)做基线实验,再根据任务类型引入空间注意力(分割任务)或非局部注意力(视频任务)。CIFAR-10 数据集适合快速验证注意力模块的有效性,迁移到更大数据集时保持相同的结构设计思路即可。

FJN110的博客 63

【LSTM回归预测】attention机制LSTM时间序列回归预测【含Matlab源码 1992期】

attention机制LSTM时间序列回归预测 完整的代码,方可运行;可提供运行操作视频!适合小白!

订阅付费专栏Matlab(奶茶价版),可赠送奶茶价版付费专栏指定代码1份; 2591

druid1.2.8源码阅读:第七天

druid1.2.8源码阅读:第七天 文章目录druid1.2.8源码阅读:第七天一、关闭数据库连接 一、关闭数据库连接 @Override public void close() throws SQLException { // 下面两段检查避免重复关闭 if (this.disable) { return; } DruidConnectionHolder holder = this.holder;

hefrankeleyn的博客 435

【WRF-Chem工具】anthro_emiss 详解:生成人为排放数据

anthro_emiss 详解:生成人为排放数据

WW、forever的博客 2056

【Druid源码阅读】1. 初识Druid

Druid源码阅读

hellboy0621的博客 1541

「深度学习之优化算法」笔记(二)优化算法的分类

但是由于生物的局限性,人们所创造出的算法也会有局限性:我们所熟知的生物都生存在三维空间,在这些环境中,影响生物生存的条件比较有限,反应到算法中就是这些算法在解决较低维度的问题时效果很好,当遇到超高维(维度>500)问题时,结果可能不容乐观,没做过实验,我也不敢乱说。当然,他们的目的不是在最佳狩猎位置集合,他们的目的是在过去的途中看是否能发现更加好的狩猎位置,去往已经到过的狩猎地点再次狩猎是没有意义的,因为每个位置获取食物的难易程度是固定的。如果他们的策略是“不跟随最优解”,那么他们的策略是什么呢?

quanzhan_King的博客 1371

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

DruidCP源码阅读1 -- Druid源码下载及集成SpringBoot,Druid与HikariCP性能对比

DruidCP源码阅读1 -- Druid源码下载及集成SpringBoot,Druid与HikariCP性能对比

扬帆起航 749

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

Druid源码阅读一

DruidSource

qq_33592535的博客 1393

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

druid1.2.8源码阅读:第九天

druid1.2.8源码阅读:第九天 文章目录druid1.2.8源码阅读:第九天一、DestroyTask线程 一、DestroyTask线程 第一步: 获取锁 try { lock.lockInterruptibly(); } catch (InterruptedException e) { return; } 第二步:判断有没有初始化 if (!inited) { return; } keepAliveCount连接: if (keepAliveCount >

hefrankeleyn的博客 204

druid1.2.8源码阅读:第八天

druid1.2.8源码阅读:第八天 文章目录druid1.2.8源码阅读:第八天一、recycle()函数 一、recycle()函数 /** * 回收连接 */ protected void recycle(DruidPooledConnection pooledConnection) throws SQLException { final DruidConnectionHolder holder = pooledConnection.holder;

hefrankeleyn的博客 242

druid1.2.8源码悦读:第六天

druid1.2.8源码阅读:线程池的连接时如何创建的 文章目录druid1.2.8源码阅读:线程池的连接时如何创建的一、背景二、锁和条件三、创建`CreateConnectionThread`线程实例,并启动线程 一、背景 在上次的源码阅读中,发现数据库连接池中连接的创建是通过CreateConnectionThread线程创建出来的。 现在就来追踪下,这个实现的过程。 二、锁和条件 在初始化DruidDataSource实例的过程中,在调用父类DruidAbstractDataSource的构造方法时,

hefrankeleyn的博客 306

druid1.2.8源码悦读:第五天

druid1.2.8源码悦读_05 文章目录druid1.2.8源码悦读_05一、回顾二、`dataSource.getConnectionDirect(maxWaitMillis)`2.1 进入一个无限循环:`for(;;)`2.2 调用`getConnectionInternal(maxWaitMillis)`(1)根据maxWaitMillis创建`nanos`(2)`connectCount++;`(3)`takeLast();`2.3 `takeLast();`(1)`emptySignal();

hefrankeleyn的博客 354

druid1.2.8源码阅读:第十天

druid1.2.8源码阅读:第十天 文章目录druid1.2.8源码阅读:第十天一、keepAlive 实现方式 一、keepAlive 实现方式 与keepAlive相关的参数有两个: dataSource.setKeepAlive(true); dataSource.setKeepAliveBetweenTimeMillis(100000); 用到keepAlive的地方: 第一个地方:如果 idle 时间大于探活时间 if (keepAlive && idleMillis >

hefrankeleyn的博客 550

Druid阅读(一)环境准备

1 下载源代码 访问Druid github地址:https://github.com/alibaba/druid,页面截图如下: 然后选中master分支,点击code->SSH或者HTTPS,复制链接git clone下载即可,页面截图如下: 下载成功后,打开命令行窗口,cd到下载好的Druid的目录下,执行mvn clean package install -Dmaven.test.skip=true -Dmaven.javadoc.skip=true -Drat.skip=true.

he_cha_bu的博客 689

Druid源码阅读6-PreparedStatementPool源码及使用场景分析

**在阅读DruidDataSource源码的过程中,发现DruidConnectionHolder有个特别的属性PreparedStatementPool statementPool。 根据经验可知,这是DruidPreparedStatement进行缓存的cache。我们在使用PreparedStatement的过程中,由于PreparedStatement对sql语句的解析和参数的注入是分开的, 因此,加入cache之后,可以在同一个连接上,对相同sql,不同参数的请求进行复用。 1.开启参数 如果要

dhaibo1986的专栏 2094

2022-05-14 Druid源码阅读——Druid连接检查机制

1.Druid提供的校验参数 Druid对于连接校验提供了六个参数,其中testOnBorrow、testOnReturn、testWhileIdle是Druid所提供的连接校验时点,其余三个参数为校验的相关配置。 配置 缺省值 说明 validationQuery 用来检测连接是否有效的sql,要求是一个查询语句,常用select ‘x’。如果validationQuery为null,testOnBorrow、testOnReturn、testWhileIdle都不会起作用。 val

风灵玄的博客 3415
上一篇: druid1.2.8源码阅读:第二天
下一篇: druid1.2.8源码悦读:第四天
鲲鹏飞九万里
博客等级 码龄10年 177粉丝 350原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值