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

python设计俄罗斯方块(附源码)

【代码】python设计俄罗斯方块(附源码)

牧魂的博客 2059

MOOS-ivp实战:从零搭建水下机器人通信系统(Ubuntu 22.04版)

本文详细介绍了在Ubuntu 22.04系统上从零开始搭建MOOS-ivp水下机器人通信系统的完整实战流程。内容涵盖环境准备、核心安装、MOOSDB通信模型解析、自定义应用节点开发、以及调试监控工具链的使用,旨在帮助开发者快速掌握这一分布式机器人系统框架,构建稳定可靠的水下机器人通信与控制系统。

snow3的博客 636

数据库连接池——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

智能座舱架构与芯片- (9) 音频篇 上

从A2B收发器衍生出来的简化产品具备各种级别的功能,例如端点从节点(不支持TDM)、简化型主节点(支持较短的电缆和更少的从节点数量),以及简化型端点从节点(支持较短电缆和更少的PDM输入)。例如,AVB中的talker和listener是不同的设备,它们的参考时钟源可能并不相同。传统的车载收音机通过天线接收无线电信号,然后由调谐模块(Tuner)进行信号调谐,信道过滤,信道均衡,多路改善,信号解调等,转为数字信号后再交给DSP进行立体声解码,噪声抑制,弱信号处理,最后从车载音响系统进行播放。

joanna_xiao的博客 4908

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

代谢组数据分析(五):代谢组的功能富集分析

本文介绍了代谢组数据分析中的功能分析,包括代谢物富集分析、GSEA和ssGSEA方法。文章详细阐述了分析原理、应用背景、数据准备、统计方法以及结果解释,强调了在代谢通路和代谢物ID对应关系建立、差异代谢物筛选、富集程度计算等方面的关键步骤。通过这些方法,可以揭示差异代谢物在生物过程中的作用,为疾病研究和药物开发提供依据。

专注生信领域 5982

微信小程序 - 完美解决“code“:“NO_AUTH“,“message“:“商户号该产品权限未开通,请前往商户平台>产品中心检查后重试“(微信小程序报错问题排查解决)

微信小程序NO_AUTH: 商户号该产品权限未开通,请前往商户平台>产品中心检查后重试?微信小程序提示商户号该产品权限未开通,请前往商户平台>产品中心检查后重试,微信小程序"code":"NO_AUTH"错误码怎么解决,报错信息如下:httpResponseBody[{"code":"NO_AUTH","message":"商户号该产品权限未开通,请前往商户平台>产品中心检查后重试"}],微信小程序支付问题,如何解决这个问题,虚拟支付商户号,虚拟支付商户号里面没有产品支付的页面,排查商户号没问题,商户号配置

🏆 前端领域优质创作者 4444

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

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件概述(ArkSIM集成开发环境 (IDE))

AFSim2.9.0学习笔记 —— 2、AFSim的Wizard软件详述(ArkSIM集成开发环境 (IDE))

923

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

Druid源码阅读

hellboy0621的博客 1541

YOLO模型部署RK3588多核NPU并行加速完整教程:基于线程池的高性能AI推理实现

本教程详细介绍了如何在RK3588平台上实现多核NPU并行加速的AI推理方案。RK3588搭载3个独立NPU核心,总算力达6TOPS,支持单核、双核和三核三种工作模式。文章深入解析了NPU硬件架构特点,包括核心独立处理能力、内存带宽分配及多核心协作机制,并提供了C++代码示例展示核心负载均衡、任务调度和内存优化策略。通过线程池技术可以有效利用多核NPU并行计算能力,显著提升AI推理性能,特别适合高并发场景。教程还包含内存子系统的瓶颈分析和性能预估方法,为开发者提供完整的优化思路。

LXY_LOVE36的博客 797

智能预测性维护AI系统实战效率提升:AI应用架构师的技巧分享

在工业领域,预测性维护(Predictive Maintenance, PdM)是降低停机损失、优化维护成本的关键手段。然而,现有系统往往面临三大效率瓶颈数据处理延迟:工业设备产生的海量实时数据(如传感器、PLC)需传输至云端处理,导致预警滞后;模型推理效率:复杂深度学习模型(如ResNet、Transformer)在边缘设备上推理时间长,无法满足实时要求;落地集成困难:与企业现有ERP、MES、SCADA系统对接繁琐,导致“模型好用但业务不用”的尴尬。本文从架构、数据、模型、落地架构设计。

AI天才研究院 746

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

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

扬帆起航 749

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Druid源码阅读一

DruidSource

qq_33592535的博客 1393

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

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

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

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、付费专栏及课程。

余额充值