mybatisplus 集成druid连接池源码分析

news2025/1/12 13:22:17

mybatisplus 集成druid连接池源码分析:从spring的源码过渡到druid的相关jar包,里面是druid相关的类,下面我们开始分析:

1、取数据库连接的地方入口:public abstract class DataSourceUtils

为spring-jdbc包里面的过渡工具类

private static Connection fetchConnection(DataSource dataSource) throws SQLException {
		Connection con = dataSource.getConnection();//找实现类去,发现有很多的实现类
		if (con == null) {
			throw new IllegalStateException("DataSource returned null from getConnection(): " + dataSource);
		}
		return con;
	}

 ctrl+t 看到:

到底进入哪个实现类呢?这时候就要看你springboot 服务配置文件手动指定的哪个连接池类:

spring:
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource

 指定druid连接池,那么就会进入 DruidDataSource:

 2、druid 连接池类:

public class DruidDataSource extends DruidAbstractDataSource implements DruidDataSourceMBean, ManagedDataSource, Referenceable, Closeable, Cloneable, ConnectionPoolDataSource, MBeanRegistration

很丰满的一个类有多个基础和实现 :下面会详细讲解,多个 配置参数:

 对应的配置文件里的配置:上面几个是数据库信息,多个是连接池信息

spring:
  datasource:
    name: user_db
    url: jdbc:mysql://127.0.0.1:3306/user_db?useSSL=false 
    type: com.alibaba.druid.pool.DruidDataSource
    driver-class-name: com.mysql.cj.jdbc.Driver
    username: root
    password: root
    druid:
      # 初始化大小
      initial-size: 10
      # 最小
      min-idle: 10
      #最大
      max-active: 30
      # 配置获取连接等待超时的时间
      max-wait: 50000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 600000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 50000
      # 校验SQL,Oracle配置 spring.datasource.validationQuery=SELECT 1 FROM DUAL,如果不配validationQuery项,则下面三项配置无用
      validation-query: SELECT 'x'
      test-on-borrow: false
      test-on-return: false
      test-while-idle: true
      # 打开PSCache,并且指定每个连接上PSCache的大小
      pool-prepared-statements: true
      max-pool-prepared-statement-per-connection-size: 30
      # 配置监控统计拦截的filters,去掉后监控界面sql无法统计,'wall'用于防火墙
      filters: stat,wall,log4j
      # 通过connectProperties属性来打开mergeSql功能;慢SQL记录
      connect-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=6000
      # 合并多个DruidDataSource的监控数据
      use-global-data-source-stat: true
      web-stat-filter:
        enabled: true
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.png,*.css,*.ico
        url-pattern: /*
      stat-view-servlet:
        allow: ''
        enabled: true
        login-password: druid
        login-username: druid
        reset-enable: false
        url-pattern: /druid/*

接口进入

    //DataSource 的实现类接口
    @Override
    public DruidPooledConnection getConnection() throws SQLException {
       //配置获取连接等待超时的时间,上面会统一的配置样例
       //max-wait: 50000
        return getConnection(maxWait);//参数最大等待时间,配置文件一般会配置,核心点,进入
    }

点击进入:

  public DruidPooledConnection getConnection(long maxWaitMillis) throws SQLException {
        init();//初始化参数,里面有很多信息,可以认真看看
        //filters 对应上面的配置
        if (filters.size() > 0) {
            FilterChainImpl filterChain = new FilterChainImpl(this);
            return filterChain.dataSource_connect(this, maxWaitMillis);
        } else {
            return getConnectionDirect(maxWaitMillis);//核心进入
        }
    }

来到一个很复杂的方法里面:

public DruidPooledConnection getConnectionDirect(long maxWaitMillis) throws SQLException {
        int notFullTimeoutRetryCnt = 0;
        for (;;) {
            // handle notFullTimeoutRetry
            DruidPooledConnection poolableConnection;
            try {
                poolableConnection = getConnectionInternal(maxWaitMillis);//核心点,进入
            } catch (GetConnectionTimeoutException ex) {
                if (notFullTimeoutRetryCnt <= this.notFullTimeoutRetryCount && !isFull()) {
                    notFullTimeoutRetryCnt++;
                    if (LOG.isWarnEnabled()) {
                        LOG.warn("get connection timeout retry : " + notFullTimeoutRetryCnt);
                    }
                    continue;
                }
                throw ex;
            }
....省略部分源码
}

 进入复杂业务,暂时屏蔽,后面详细优化:此处主要是获取数据库连接信息

同时此处也可以自定义添加业务,中间可以通过类型,或者用户获取连接信息,比如在spring工具类和DruidDataSource 类直接添加一个过渡类,并且通过配置spring.datasource.type指定,专门处理用户和数据源的对应关系,缓存起来使用,每次用户来取连接时先去缓存取,缓存没有再通过接口取,缓存起来数据库对象信息,返回给用户,这样从最底层解决动态多数据源问题,并且业务代码没有任何耦合性,不会漏掉某个接口,唯一的担心是性能上需要注意,保证高性能。

后面我们分享多数据源时,会详细分享。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/76156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

深度学习 Day21——利用RNN实现心脏病预测

深度学习 Day21——利用RNN实现心脏病预测 文章目录深度学习 Day21——利用RNN实现心脏病预测一、前言二、我的环境三、什么是RNN四、前期工作1、设置GPU2、导入数据3、检查数据五、数据预处理1、划分数据集2、数据标准化六、构建RNN模型七、编译模型八、训练模型九、模型评估十…

网站TDK三大标签SEO优化

网站TDK三大标签SEO优化 SEO(Search Engine Optimization)汉译为搜索引擎优化&#xff0c;是一种利用搜索引擎的规则提高网站在有关搜索引擎内自然排名的方式 SEO的目的是对网站进行深度的优化&#xff0c;从而帮助网站获取免费的流量&#xff0c;进而在搜索引擎上提升网站的排…

day39 CSRFSSRF协议玩法内网探针漏洞利用

前言&#xff1a; #知识点&#xff1a; 1、CSRF-原理&危害&探针&利用等 2、SSRF-原理&危害&探针&利用等 3、CSRF&SSRF-黑盒下漏洞探针点 详细点&#xff1a; CSRF 全称&#xff1a;Cross-site request forgery&#xff0c;即&#xff0c;跨站…

java计算机毕业设计ssm兴发农家乐服务管理系统n159q(附源码、数据库)

java计算机毕业设计ssm兴发农家乐服务管理系统n159q&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&…

RK3568平台开发系列讲解(系统优化篇)如何进行内存优化

🚀返回专栏总目录 文章目录 一、设备分级二、Bitmap 优化三、内存泄漏沉淀、分享、成长,让自己和他人都能有所收获!😄 📢内存优化,应该从哪里着手呢?我通常会从设备分级、Bitmap 优化和内存泄漏这三个方面入手。 一、设备分级 内存优化首先需要根据设备环境来综合考虑…

硬件基础

目录 一、Cisco Packet Tracer 8.1.1安装 二、汉化 一、Cisco Packet Tracer 8.1.1安装 官方汉化包的Ciscohttps://www.netacad.com/portal/resources/browse/341e11c1-d03f-4433-9413-29b9d207e7eb 直接在官网下载但是官网有时候比较慢 思科数据包跟踪器 - 网络仿真工具 (n…

北斗/GNSS高精度数据处理暨GAMIT/GLOBK v10.75软件

随着GNSS导航定位技术在不同领域的广泛应用和技术更新的飞速发展&#xff0c;在大型工程项目的设计、施工、运行和管理各个阶段对工程测量提出了更高的要求&#xff0c;许多测绘、勘测、规划、市政、交通、铁道、水利水电、建筑、矿山、道桥、国土资源、气象、地震等行业部门在…

【实时数仓】介绍、需求分析、统计架构分析和ods层日志行为数据采集

文章目录一 电商实时数仓介绍1 普通实时计算与实时2 实时电商数仓分层二 实时数仓需求分析1 离线计算与实时计算的比较2 应数场景&#xff08;1&#xff09;日常统计报表或分析图中需要包含当日部分&#xff08;2&#xff09;实时数据大屏监控&#xff08;3&#xff09;数据预警…

不同系列的 ESP 芯片的 GPIO 默认初始状态

ESP 系列芯片的 GPIO 上电状态的含义&#xff1a; wpu: weak pull-up&#xff08;为弱上拉模式&#xff09;wpd: weak pull-down&#xff08;为弱下拉模式&#xff09;ie: input enable&#xff08;输入使能模式&#xff09;oe: output enable&#xff08;输出使能模式&#x…

【Docker】第三章 镜像管理

3.1 镜像是什么 简单说&#xff0c;Docker镜像是一个不包含Linux内核而又精简的Linux操作系统。 3.2 镜像从哪里来 Docker Hub 是由Docker公司负责维护的公共注册中心&#xff0c;包含大量的容器镜像&#xff0c;Docker工具默认从这个公共镜像库下载镜像。 https://hub.docker.…

碳中和科普

什么叫碳达峰和碳中和&#xff1f; 我国在2020年第75届联合国大会上宣布&#xff0c;二氧化碳排放量努力争取于2030年前达到峰值&#xff0c;2060年前实现碳中和。 碳达峰和碳中和中的碳指的都是以二氧化碳为代表的温室气体 碳达峰 碳达峰指的是碳排放达到峰值后进入平稳下降…

洛谷入门赛 202212F 宇宙密码 ——深搜

题目描述 经历十九年的探索&#xff0c;人们终于找到了宇宙中的那份瑰宝。 这份瑰宝被装在一个密码箱里&#xff0c;按照情报&#xff0c;密码应为一串长度为 nn 的数字 aa。 人们满怀希望地输入了密码&#xff0c;但是密码箱没有任何反应。 这时人们意识到&#xff0c;在十…

迈向高算力、跨域融合新拐点,智能座舱各路玩家如何卡位?

当前&#xff0c;中国车联网发展进入平稳增长周期&#xff0c;5G、V2X市场迎来拐点。 借助数字化转型驱动&#xff0c;互联化、数字化、个性化的智能座舱&#xff0c;以及与之强关联的座舱域控制器方案正实现快速发展和落地。 高工智能汽车研究院监测数据显示&#xff0c;202…

[附源码]Python计算机毕业设计SSM基于人脸识别和测温的宿舍管理系统(程序+LW)

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

使用ESPRIT,LS-ESPRIT,Music以及Root-Music四种算法进行角度估计matlab仿真

目录 一、理论基础 二、核心程序 三、测试结果 一、理论基础 1.1ESPRIT ESPRIT算法全称为&#xff1a;Estimation of Signal Parameters using Rotational Invariance Techniques.与Root_MUSIC算法相同&#xff0c;也是一种参数估计技术。ESPRIT算法在旋转矢量中&#xff0…

Jetpack组件(三)Lifecycle

本篇是Jetpack组件系列文章的第三篇&#xff0c;将介绍第二个组件Lifecycle。Lifecycle为开发者管理 Activity 和 Fragment 生命周期提供了极大的便利&#xff0c;帮助开发者书写更轻量、易于维护的代码 一、Lifecycle简介 Lifecycle用于存储有关组件&#xff08;如 activity …

UE实现指北针效果

文章目录 1.实现目标2.实现过程2.1 设计指北针Widget2.2 实时指北2.3 添加到页面显示3.参考资料1.实现目标 在UE中实现指北针效果,GIF图如下。 2.实现过程 实现思路较为简单,即获取到当前场景的Rotation,来设置UMG的旋转角度即可。 2.1 设计指北针Widget 包括底图圆环,…

嵌入式开发学习之--通讯的基本概念

提示&#xff1a;本章主要了解一下通讯的基本概念&#xff0c;无代码 文章目录前言一、通讯的基本概念1.1串行通讯与并行通讯1.2全双工、半双工及单工通讯1.3同步通讯与异步通讯1.4通讯速率总结前言 对于嵌入式开发来说&#xff0c;基本就是在传递信息和解析信息&#xff0c;根…

Kafka高级特性解析之物理存储

1、日志存储概述 Kafka 消息是以主题为单位进行归类&#xff0c;各个主题之间是彼此独立的&#xff0c;互不影响。每个主题又可以分为一个或多个分区。每个分区各自存在一个记录消息数据的日志文件。图中&#xff0c;创建了一个 tp_demo_01 主题&#xff0c;其存在6个 Paritio…

《四叶游戏》:梦想执念·棒球1号位

《幸运四叶草》又名《四叶游戏》&#xff0c;是日本漫画家安达充的代表作品之一。 2005年 – 2010年在《周刊少年Sunday》上连载。是小学馆漫画赏第54回&#xff08;平成20年度&#xff09;少年向部门得奖作品。作品亦改编为同名电视动画和游戏。 中文名 幸运四叶草 原版名称 …