Spring Boot 整合 Druid

目录

🍎前言

🍊数据库连接池

🍊为什么需要使用数据库连接池

🍊常见的连接池分类

🍎什么是Druid

🍊Druid的功能

🍊基本配置参数如下:

🍎整合Druid

🍊导入Druid数据源依赖

🍊配置数据源

🍊获取当前数据源

🍊根据需求配置数据源的配置

🍊绑定全局配置文件的参数

🍊配置Druid数据源监控

🍊配置DruidWeb监控Filter的过滤器

🍎总结


🍎前言

🍊数据库连接池

数据库连接池是程序启动时建立足够的数据库连接,并将这些连接组成一个连接池,由程序动态的对池中连接进行申请、使用、释放

🍊为什么需要使用数据库连接池

数据库连接是一件费事的操作,连接池可以使得多个操作共享一个连接,数据库连接池就是为数据库建立一个缓冲区。

当需要建立数据库连接时,只需要从缓冲区中取出一个,使用完毕后再放回去;使用数据库连接池可以提高对数据库连接资源的管理,数据库连接池负责分配、管理和释放数据库连接,允许程序重复使用一个现有的数据库连接,而不是重新建立一个;可以通过设定连接池最大连接数来防止系统无尽的与数据库连接

🍊常见的连接池分类

  1. DBCP连接池:采用标准的java EE JDBC API来实现,同时支持JNDI,非常灵活;但是版本比较老了,而且在高并发场景下性能可能存在问题
  2. C3P0连接池:C3P0是一个开源的JDBC连接池,它实现了数据源和JNDI绑定,支持JDBC3规范和JDBC2的标准扩展
  3. HikariCP连接池:专为高并发场景设计,性能优越,具有最快的初始化速度和最小的延迟,支持JDBC4 API;但是由于需要更多的JVM资源,可能会造成资源消耗问题
  4. druid连接池:支持JDBC和Oracle驱动程序徐,全面的性能检测,对等分布式,具有强大的扩展功能和高度定制和配置

🍎什么是Druid

Druid是阿里巴巴开源平台上一个数据库连接池实现,结合了c3p0、DBCP等DB池的优点,同时加入了日志监控

spring boot 2.0以上默认使用Hikari数据库连接池,可以说Hikari和Druid都是当前Java web上最优秀的数据库连接池

 我们可以通过以下代码来查看我们所用的是什么连接池

 @Autowired
 private DataSource dataSource;
@Test
 void test(){
    System.out.println(dataSource.getClass());
}

🍊Druid的功能

  1. 监控数据库访问性能
    1. Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,可以很好的监控sql的执行情况
  2. 替换传统的DBCP和c3p0连接池中间件
    1. Druid提供了强大高效,可扩展性的数据库连接池
  3. 扩展JDBC
    1. 如对JDBC层由要求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件
  4. SQL执行日志
    1. Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j、jdkLog,可以按需求选择响应的LogFilter
  5. 数据库密码加密
    1. 数据库密码写在配置文件中,安全性不高

🍊基本配置参数如下:

配置默认值描述

username

连接数据库的用户名

password

连接数据库的密码

jdbcUrl

同DBCP中的jdbcUrl属性

driverClassName

根据url自动识别

这一项可配可不配,如果不配置druid会根据url自动识别dbType,然后选择相应的driverClassName

initialSize

0

初始化时建立物理连接的个数。初始化发生在显示调用init方法,或者第一次getConnection时 *参见DBCP中的initialSize属性

maxActive

8

最大连接池数量(Maximum number of Connections a pool will maintain at any given time.) *参见DBCP中的maxTotal属性

maxIdle

8

已经不再使用,配置了也没效果*参见DBCP中的maxIdle属性

minIdle

最小连接池数量

maxWait

获取连接时最大等待时间,单位毫秒。配置了maxWait之后,缺省启用公平锁,并发效率会有所下降,如果需要可以通过配置useUnfairLock属性为true使用非公平锁。

poolPreparedState- ments

false

是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle。

maxOpenPrepared- Statements

-1

要启用PSCache,必须配置大于0,当大于0时,poolPreparedStatements自动触发修改为true。在Druid中,不会存在Oracle下PSCache占用内存过多的问题,可以把这个数值配置大一些,比如说100

testOnBorrow

true

申请连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能。

testOnReturn

false

归还连接时执行validationQuery检测连接是否有效,做了这个配置会降低性能

testWhileIdle

false

建议配置为true,不影响性能,并且保证安全性。申请连接的时候检测,如果空闲时间大于timeBetweenEvictionRunsMillis,执行validationQuery检测连接是否有效。

validationQuery

用来检测连接是否有效的sql,要求是一个查询语句。如果validationQuery为null,testOnBorrow、testOnReturn、 testWhileIdle都不会其作用。在mysql中通常为select ‘x’,在oracle中通常为select 1 from dual

timeBetweenEviction-RunsMillis

1) Destroy线程会检测连接的间隔时间 2) testWhileIdle的判断依据

minEvictableIdle- TimeMillis

Destory线程中如果检测到当前连接的最后活跃时间和当前时间的差值大于minEvictableIdleTimeMillis,则关闭当前连接。

removeAbandoned

对于建立时间超过removeAbandonedTimeout的连接强制关闭

removeAbandoned-Timeout

指定连接建立多长时间就需要被强制关闭

logAbandoned

false

指定发生removeabandoned的时候,是否记录当前线程的堆栈信息到日志中

filters

属性类型是字符串,通过别名的方式配置扩展插件,常用的插件有: 1)监控统计用的filter:stat 2)日志用的filter:log4j 3)防御sql注入的filter:wall

     

🍎整合Druid

🍊导入Druid数据源依赖

注意,我这里用的是springboot3.x版本,这里的druid数据源必须是1.2.19以上

错误导入:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.17</version>
</dependency>

正确导入:

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-3-starter</artifactId>
    <version>1.2.21</version>
</dependency>

🍊配置数据源

springboot2.0以上默认使用的是hikari数据源,所以我们需要将数据源指定为Druid

spring:
  datasource:
    #druid数据源配置
    druid:
      username: root # mysql账号
      password: root # mysql 密码
      driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
      url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址

🍊获取当前数据源

随后我们在通过以下方式重新获取一下,得到数据源就是druid的了,证明我们指定的数据源生效了

c35ddbec44ab4b058eafd098f24fa5a3.png

🍊根据需求配置数据源的配置

spring:
  datasource:
    #druid数据源配置
    druid:
      username: root # mysql账号
      password: root # mysql 密码
      driver-class-name: com.mysql.cj.jdbc.Driver # 驱动包名
      url: jdbc:mysql://localhost:3306/recordnetwork?useUnicode=true&characterEncoding=utf-8 # 连接地址
      # 初始化建立物理连接个数
      initial-size: 5
      # 最小连接数
      min-idle: 5
      # 最大连接数
      max-active: 10
      # 最大等待时间,单位毫秒
      max-wait: 6000
      # 检测连接是否有效
      time-between-eviction-runs-millis: 60000
      # 连接在池中的最小生存时间
      min-evictable-idle-time-millis: 300000
      # 检测连接是否有效的SQL 要求是一个查询语句
      validation-query: SELECT 1 FROM DUAL
      # 这些参数控制何时检测连接的有效性。
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      # 是否缓存预编译的sql语句
      pool-prepared-statements: true
      # 配置监控统计拦截的filters,stat:监控统计,log4j:日志记录,wall:防御sql注入
      filters: stat,wall,log4j
      # 每个连接可缓存的预编译语句的最大数量。
      max-pool-prepared-statement-per-connection-size: 20 #
      # 是否启用全局的数据统计功能。
      use-global-data-source-stat: true
      # 连接属性,这里设置了合并SQL和慢查询的阈值(毫秒)。
      connection-properties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=500

注意:这些配置还没生效,因为还没有把自定义属性配置上去

我们在配置文件中配置了最大连接数10,初始化连接数为5

测试一下看看

 @Autowired
 private DataSource dataSource;
@Test
 void test(){
    DruidDataSource druidDataSource = (DruidDataSource)dataSource;
    System.out.println("最大连接数:" + druidDataSource.getMaxActive());
    System.out.println("初始化连接数:" + druidDataSource.getInitialSize());
}

发现是8和0是错的。

4d4c7e603477497c814ce265fc9f1f00.png

因为上面的配置用到了日志,我们需要导入一下log4j的依赖

<!--        log4j依赖-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>

🍊绑定全局配置文件的参数

package com.sxy.recordnetwork.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * druid配置类
 */
@Configuration

public class DruidConfig {
    @ConfigurationProperties(prefix = "spring.datasource.druid")
    @Bean
    public DataSource druidDataSource() {
        return new DruidDataSource();
    }
}

然后我们再测试已经成功了

e15f7a7316214311bace75824eb7cad2.png

🍊配置Druid数据源监控

Druid提供了具有监控的功能,提供了一个web界面供用户查看,我们得设置Druid后台管理页面,如登录账号、密码等

spring:
  datasource:
    #druid数据源配置
    druid:
        // 其他配置
      # 配置可视化控制台页面
      stat-view-servlet:
        enabled: true
        # 访问druid监控页面的地址
        url-pattern: /druid/*
#        IP 白名单 没有配置或者为空则允许所有访问
        allow:
          # IP黑名单,若白名单也存在则优先使用
        deny:
        # 禁用重置按钮
        reset-enable: true
        # 登录所用的用户名与密码
        login-username: admin
        login-password: 123456

随后就可以访问监控页面了

dde910a4526b47f69b1c3b31b2d3d6cc.png

🍊配置DruidWeb监控Filter的过滤器

spring:
  datasource:
    #druid数据源配置
    druid:
       #配置过滤器,过滤掉静态文件
        web-stat-filter:
         enabled: true
         url-pattern: /*
         exclusions: /druid/*,*.js,*.css,*.gif,*.jpg,*.bmp,*.png,*.ico

配置以上即可

🍎总结

以上就是Spring Boot3.x整合Druid的大致流程。

有什么问题还请各位在下方评论区留言,感谢支持!!!

更多内容请关注我的微信订阅号哦~

ebc780c7f45b44ff86dbd6d791c457f4.jpg

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入解析Java中Set接口

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

ai直播-智能化视频直播-全程自动学,高效互动问答!

ai直播-智能化视频直播-全程自动学&#xff0c;高效互动问答&#xff01; 普通人想要致富&#xff0c;光靠勤劳是不可能的&#xff0c;唯有抓住时代风口&#xff0c;才能铸造成功之路。 大家都知道&#xff0c;现在最赚钱的行业&#xff0c;直播和卖货&#xff0c;肯定是名列…

今日arXiv最热NLP大模型论文:NAACL24实锤语言学对大模型“负优化”,抽象语义表示+思维链有损表现

大语言模型正以势不可挡的姿态席卷自然语言处理领域。在这个语言模型大显神威的时代&#xff0c;很多任务都转变为了端到端的文本生成任务。那么&#xff0c;在此之前我们苦心孤诣研究了几十年的语义表示&#xff0c;例如 AMR(抽象意义表示)&#xff0c;在这个时代里还能派上用…

手撕spring框架(5)

手撕spring框架(5) 相关系列 手撕spring框架&#xff08;1&#xff09; 手撕spring框架&#xff08;2&#xff09; 手撕spring框架&#xff08;3&#xff09; 手撕spring框架&#xff08;4&#xff09; 这是本专题最后一节了&#xff0c;主要是讲述自定义一个注解&#xff0c;实…

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水

代码随想录算法训练营第六十二天|503.下一个更大元素II、42.接雨水 503.下一个更大元素II 给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元…

【kernel exploit】CVE-2024-1086 nftables UAF漏洞-Dirty Pagedirectory利用方法

影响版本&#xff1a;Linux v3.15 - v6.7.2。v5.15.149 / v6.1.76 / v6.6.15 / v6.7.3 已修复&#xff0c;包括CentOS、Debian、Ubuntu和KernelCTF等。 注意&#xff0c;本exp适用于v5.14.21~v6.3.13&#xff0c;成功率99.4%&#xff1b;对于v6.4及以上版本的内核&#xff0c;…

buuctf-misc题目练习三

荷兰宽带数据泄露 BIN 文件&#xff0c;也称为二进制文件&#xff0c;是一种压缩文件格式&#xff0c;可以 包含图像和视频等信息 , 并被许多应用程序用于各种目的。 RouterPassView是一个找回路由器密码的工具。 大多数现代路由器允许备份到一个文件路由器的配置&#xff0c…

双目相机标定流程(MATLAB)

一&#xff1a;经典标定方法 1.1OPENCV 1.2ROS ROS进行双目视觉标定可以得到左右两个相机的相机矩阵和畸变系数&#xff0c;如果是单目标定&#xff0c;用ROS会非常方便。 3.MATLAB标定&#xff08;双目标定&#xff09; MATLAB用来双目标定会非常方便&#xff0c;主要是为…

【算法入门赛】A.坐标变换(推荐学习)C++题解与代码

比赛链接&#xff1a;https://www.starrycoding.com/contest/8 题目描述 武汉市可以看做一个二维地图。 牢 e e e掌握了一项特异功能&#xff0c;他可以“瞬移”&#xff0c;每次瞬移需要分别设定 x x x和 y y y的偏移量 d x dx dx和 d y dy dy&#xff0c;瞬移完成后位置会…

电脑设置在哪里打开?Window与Mac双系统操作指南

随着科技的不断发展&#xff0c;电脑已经成为我们日常生活和工作中不可或缺的一部分。然而&#xff0c;对于许多初学者来说&#xff0c;如何找到并熟悉电脑的设置界面可能是一个挑战。特别是对于那些同时使用Windows和Mac双系统的用户来说&#xff0c;更是需要一篇详尽的指南来…

【计算机毕业设计】springboot国风彩妆网站

二十一世纪我们的社会进入了信息时代&#xff0c; 信息管理系统的建立&#xff0c;大大提高了人们信息化水平。传统的管理方式对时间、地点的限制太多&#xff0c;而在线管理系统刚好能满足这些需求&#xff0c;在线管理系统突破了传统管理方式的局限性。于是本文针对这一需求设…

ntfs文件系统的优势 NTFS文件系统的特性有哪些 ntfs和fat32有什么区别 苹果电脑怎么管理硬盘

对于数码科技宅在新购得磁盘之后&#xff0c;出于某种原因会在新的磁盘安装操作系统。在安装操作系统时&#xff0c;首先要对磁盘进行分区和格式化&#xff0c;而在此过程中&#xff0c;操作者们需要选择文件系统。文件系统也决定了之后操作的流程程度&#xff0c;一般文件系统…

MySQL存储引擎详解

存储引擎 MySQL体系结构 连接层&#xff1a;与客户端连接&#xff0c;权限校验、连接池服务层&#xff1a;SQL接口和解析、查询优化、缓存、函数引擎层&#xff1a;索引、存储引擎存储层&#xff1a;系统文件、日志&#xff08;Redo、Undo等&#xff09; 存储引擎介绍 不同的…

暴力数据结构之栈与队列(队列详解)

1.队列的定义 队列是一种特殊的线性表&#xff0c;它遵循先进先出&#xff08;FIFO&#xff09;的原则。在队列中&#xff0c;只允许在表的一端进行插入操作&#xff08;队尾&#xff09;&#xff0c;而在另一端进行删除操作&#xff08;队头&#xff09;。这种数据结构确保了最…

【WebGIS实例】(14)MapboxGL 加载地形高程数据

前言 官网示例&#xff1a;Add 3D terrain to a map | Mapbox GL JS | Mapbox 大佬博客&#xff1a;Mapbox GL基础&#xff08;七&#xff09;&#xff1a;地形数据的处理与加载 (jl1mall.com) 加载Mapbox地形数据 map.once(style.load, () > {map.addSource(mapbox-dem,…

改变视觉创造力:图像合成中基于样式的生成架构的影响和创新

原文地址&#xff1a;revolutionizing-visual-creativity-the-impact-and-innovations-of-style-based-generative 2024 年 4 月 30 日 介绍 基于风格的生成架构已经开辟了一个利基市场&#xff0c;它将机器学习的技术严谨性与类人创造力的微妙表现力融为一体。这一发展的核…

Windows11 同时安装jdk8和jdk17 可切换

Windows11 同时安装jdk8和jdk17 可切换 死忠于JDK8的码农们&#xff0c;可能不得不做出一些改变的 因为在springboot3最低也是只能用17 并且最近如果创建springboot项目的时候&#xff0c;你会发现&#xff0c;最低也是17的 并且&#xff0c;如果使用springcloud开发&#x…

达梦数据库查询最近N天的日期列表

获取近10天的日期列表&#xff1a; //10替换成需要的天数N select to_char(trunc(sysdate)-level,YYYY-MM-DD) from dual connect by rownum<10; 查询结果如下&#xff1a;

牛客小白月赛93

B交换数字 题目&#xff1a; 思路&#xff1a;我们可以知道&#xff0c;a*b% mod (a%mod) * (b%mod) 代码&#xff1a; void solve(){int n;cin >> n;string a, b;cin >> a >> b;for(int i 0;i < n;i )if(a[i] > b[i])swap(a[i], b[i]);int num1…

TriCore: Architecture

说明 本文是 英飞凌 架构文档 TriCore TC162P core archiecture Volume 1 of 2 (infineon.com) 的笔记&#xff0c;稍作整理方便查阅&#xff0c;错误之处&#xff0c;还请指正&#xff0c;谢谢 :) 1. Architecture 2. General Purpose & System Register 名词列表&#…