SpringBoot整合Druid连接池

article/2025/9/15 13:23:19

SpringBoot整合Druid连接池

  • 前言
  • 第一种整合方式
    • 自定义的方式
      • 引入Druid依赖
      • 配置文件
      • 配置类
      • 实现监控功能
      • 开启SQL防火墙
      • 实现web应用
      • 访问Druid页面需登录
  • 第二种整合方式
    • 引入SpringBoot的stater方式
      • 引入依赖
      • 分析自动配置
      • 具体配置示例
      • 重启服务测试
  • 总结

前言

Druid是阿里巴巴开发的数据库连接池,是目前最好的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池。
它包括三个部分:

  • 基于Filter-Chain模式的插件体系

  • DruidDataSource 高效可管理的数据库连接池

  • SQLParser
    Druid的功能:

  • 替换DBCP和C3P0。Druid提供了一个高效、功能强大、可扩展性好的数据库连接池

  • 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助

  • 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDruiver和DruidDataSource都支持PasswordCallback

  • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况

  • 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter机制,很方便编写JDBC层的扩展插件
    官方地址:
    链接: Druid官方Github地址

第一种整合方式

自定义的方式

引入Druid依赖

        <dependency><groupId>com.alibaba</groupId><artifactId>druid</artifactId><version>1.1.17</version></dependency>

配置文件

spring:datasource:url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8username: rootpassword: admindriver-class-name: com.mysql.jdbc.Driver

配置类

配置自定义数据源

package com.gavin.boot.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;
import java.sql.SQLException;/*** 自定义数据源*/
@Configuration
public class MyDataSource {/*** 配置数据源* @return*/@ConfigurationProperties("spring.datasource")@Beanpublic DataSource dataSource() throws SQLException {DruidDataSource druidDataSource = new DruidDataSource();//加入监控功能druidDataSource.setFilters("stat,wall");return druidDataSource;}
}

测试

package com.gavin.boot;import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;import javax.sql.DataSource;@Slf4j
@SpringBootTest
class BootJdbcApplicationTests {@AutowiredDataSource dataSource;@Testvoid contextLoads() {log.info("数据源为:" + dataSource.getClass());}
}

测试结果为:
在这里插入图片描述
可以看出将DataSource数据源更换为Druid数据源了,这里提一下springboot默认的数据源是Hikari

实现监控功能

先修改自定义配置类

package com.gavin.boot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;/*** 自定义数据源*/
@Configuration
public class MyDataSource {/*** 配置数据源* @return*/@ConfigurationProperties("spring.datasource")@Beanpublic DataSource dataSource() throws SQLException {DruidDataSource druidDataSource = new DruidDataSource();//加入监控功能druidDataSource.setFilters("stat");return druidDataSource;}/*** 配置druid的监控功能* @return*/@Beanpublic ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");return registrationBean;}
}

再写一个访问数据库的controller类

package com.gavin.boot.controller;import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.ResponseBody;@Controller
public class IndexController {@Autowiredprivate JdbcTemplate jdbcTemplate;@GetMapping("/sql")@ResponseBodypublic Long queryForObject() {Long aLong = jdbcTemplate.queryForObject("select count(*) from sys_user", Long.class);return aLong;}
}

重启服务测试:
先访问Druid页面
地址:http://localhost:8080/druid
在这里插入图片描述
可以看出SQL监控中没有执行过SQL
接下访问IndexController 中的/sql接口,去访问数据库
地址:http://localhost:8080/sql
访问结果:
在这里插入图片描述
再返回Druid页面查看SQL监控
在这里插入图片描述
可以看出刚才访问接口的记录在SQL监控中可以看到

开启SQL防火墙

修该配置类,在druidDataSource.setFilters()方法中添加参数值wall

package com.gavin.boot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import javax.sql.DataSource;
import java.sql.SQLException;/*** 自定义数据源*/
@Configuration
public class MyDataSource {/*** 配置数据源* @return*/@ConfigurationProperties("spring.datasource")@Beanpublic DataSource dataSource() throws SQLException {DruidDataSource druidDataSource = new DruidDataSource();//加入监控功能druidDataSource.setFilters("stat,wall");return druidDataSource;}/*** 配置druid的监控功能* @return*/@Beanpublic ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");return registrationBean;}
}

重启服务测试:
访问/sql接口
在这里插入图片描述
再访问Druid页面,点击SQL防火墙
在这里插入图片描述
可以在SQL防火墙中看到刚才访问接口的信息

实现web应用

修改配置类,注入FilterRegistrationBean

package com.gavin.boot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.sql.Array;
import java.sql.SQLException;
import java.util.Arrays;/*** 自定义数据源*/
@Configuration
public class MyDataSource {/*** 配置数据源* @return*/@ConfigurationProperties("spring.datasource")@Beanpublic DataSource dataSource() throws SQLException {DruidDataSource druidDataSource = new DruidDataSource();//加入监控功能druidDataSource.setFilters("stat,wall");return druidDataSource;}/*** 配置druid的监控功能* @return*/@Beanpublic ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");return registrationBean;}/*** 配置WebStatFilter* @return*/@Beanpublic FilterRegistrationBean webStatFilter() {WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);registrationBean.setUrlPatterns(Arrays.asList("/*"));registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return registrationBean;}
}

重启服务测试:
访问/sql接口
在这里插入图片描述
再访问Druid页面,点击web应用
在这里插入图片描述
可以看到接口访问信息

访问Druid页面需登录

在访问Druid页面时,我们可以增加登录验证,输入正确的用户名密码后才能访问页面
实现方法:设置registrationBean.addInitParameter()和registrationBean.addInitParameter()这两个参数即可

package com.gavin.boot.config;import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;import javax.sql.DataSource;
import java.sql.Array;
import java.sql.SQLException;
import java.util.Arrays;/*** 自定义数据源*/
@Configuration
public class MyDataSource {/*** 配置数据源* @return*/@ConfigurationProperties("spring.datasource")@Beanpublic DataSource dataSource() throws SQLException {DruidDataSource druidDataSource = new DruidDataSource();//加入监控功能druidDataSource.setFilters("stat,wall");return druidDataSource;}/*** 配置druid的监控功能* @return*/@Beanpublic ServletRegistrationBean statViewServlet() {StatViewServlet statViewServlet = new StatViewServlet();ServletRegistrationBean<StatViewServlet> registrationBean = new ServletRegistrationBean<>(statViewServlet, "/druid/*");registrationBean.addInitParameter("loginUsername", "admin");registrationBean.addInitParameter("loginPassword", "123456");return registrationBean;}/*** 配置WebStatFilter* @return*/@Beanpublic FilterRegistrationBean webStatFilter() {WebStatFilter webStatFilter = new WebStatFilter();FilterRegistrationBean<WebStatFilter> registrationBean = new FilterRegistrationBean<>(webStatFilter);registrationBean.setUrlPatterns(Arrays.asList("/*"));registrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");return registrationBean;}
}

重启服务测试:
直接访问Druid页面
在这里插入图片描述
输入正确的用户名密码后就可以访问了
在这里插入图片描述

第二种整合方式

引入SpringBoot的stater方式

引入依赖

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

分析自动配置

分析源码从DruidDataSourceAutoConfigure这个类作为入口,往下面去看
在这里插入图片描述
主要看下面这几个核心的类
在这里插入图片描述
简单说下这几个类的作用,有兴趣的话自己可以研究下

  • DruidSpringAopConfiguration.class:监控SpringBean
  • DruidStatViewServletConfiguration.class:监控页的配置
  • DruidWebStatFilterConfiguration.class: web监控配置
  • DruidFilterConfiguration.class:所有Druid自己filter的配置

具体配置示例

直接在application.yml配置文件里面配置就可以使用了
参考配置如下:

spring:datasource:url: jdbc:mysql://localhost:3306/test?characterEncoding=utf8username: rootpassword: admindriver-class-name: com.mysql.jdbc.Driverdruid:aop-patterns: com.atguigu.admin.*  #监控SpringBeanfilters: stat,wall     # 底层开启功能,stat(sql监控),wall(防火墙)stat-view-servlet:   # 配置监控页功能enabled: truelogin-username: adminlogin-password: adminresetEnable: falseweb-stat-filter:  # 监控webenabled: trueurlPattern: /*exclusions: '*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*'filter:stat:    # 对上面filters里面的stat的详细配置slow-sql-millis: 1000logSlowSql: trueenabled: truewall:enabled: trueconfig:drop-table-allow: false

重启服务测试

和之前一样,直接访问:http://localhost:8080/druid
在这里插入图片描述
输入用户名密码登录成功后,可以访问到Druid首页
在这里插入图片描述

总结

以上就是Druid连接池的基本用法,以后了解到其它新的功能后再更新吧。


http://chatgpt.dhexx.cn/article/IIwN7cIG.shtml

相关文章

Druid连接池原理

一、数据库连接池初始化 (1)、 如果设置了maxWait或者构造函数参数传入的为true&#xff0c;则创建的ReentrantLock为公平锁&#xff0c;否者为非公平锁 (2)、 如果设置了initialSize>1&#xff0c;则会启动是创建initialSize个数数据库物理连接到线程池。 (3)、 如果没设置…

Druid之连接池

需要注意的是&#xff0c;我们下面提供的几种实现方式都是基于简单的原型&#xff0c;目的是带你了解连接池实现的一些基本原理。真实的数据库连接池技术需要考虑更多复杂的细节。 所以下面这些代码都是不能在生产上直接使用的。 实现的时候会用到java.sql.Connection&#x…

Druid连接池核心原理

一、什么是Druid连接池&#xff1f; Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生&#xff0c;内置强大的监控功能&#xff0c;监控特性不影响性能。功能强大&#xff0c;能防SQL注入&#xff0c;内置Loging能诊断Hack应用行为。 竞品对比 从上表可以…

德鲁伊连接池(druid)

文章目录 一、连接池1、什么是连接池2、为什么要用连接池 二、德鲁伊连接池&#xff08;druid)1.介绍2.代码实操 一、连接池 1、什么是连接池 简单来说就是一组连接组成的一个池子(集合)&#xff0c;称为连接池。 连接池是创建和管理一个连接的缓冲池技术。 2、为什么要用连…

【Druid 连接池】 学习~快速 掌握连接池基本原理

文章目录 前言提出问题&#xff1a;一、Druid连接池简述 再次提出问题 &#xff1a;二、初始化连接池三、了解三个核心成员&#xff08;三大线程&#xff09;四、获取连接五、探活&#xff08;连接池连接健康的检查机制&#xff09; 前言 翻遍了各个大佬发的博客整理出来的学习…

Druid连接池的基本配置与使用

Druid简介 Druid是阿里巴巴的开源连接池组件&#xff0c;是世界上最好的连接池之一。Druid能对数据库连接进行有效管理和重用&#xff0c;最大化程序执行的效率。连接池负责创建和管理连接&#xff0c;程序只负责取用与归还。 以下是我画的示意图&#xff1a; 下面我来给大家…

MySQL快捷键注释

MySQL语句注释快捷键显示为CtrlOemQuestion&#xff0c;对应于我们键盘上的是Ctrl&#xff1f;

Mysql 增加表注释

关注微信公共号&#xff1a;小程在线 关注CSDN博客&#xff1a;程志伟的博客 方法一&#xff1a; mysql添加表注释 ALTER TABLE 表名 COMMENT 注释字段; 实例&#xff1a; alter table test comment 测试表&#xff1b; 方法二&#xff1a; 在创建表的时候直接增加表注释…

mysql语句中的注释方法_MySQL语句注释方式简介

MySQL支持三种注释方式&#xff1a; 1.从‘#字符从行尾。 2.从‘-- 序列到行尾。请注意‘-- (双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。 3.从/*序列到后面的*/序列。结束序列不一定在同一行中&#xff0c;因此该语法允许注释跨越多行…

MySQL注释:单行注释和多行注释,快进来理解

单行注释与多行注释 单行注释多行注释 单行注释 单行注释可以使用#注释符&#xff0c;#注释符后直接加注释内容 #注释内容单行注释可以使用- -注释符&#xff0c;- -注释符后需要加一个空格&#xff0c;注释才能生效。 -- 注释内容#和–的区别就是&#xff1a;#后面直接加注…

Mysql注释

Mysql注释 MySQL服务器支持3种注释风格&#xff1a; 从‘#’字符从行尾。 从‘-- ’序列到行尾。请注意‘-- ’(双破折号)注释风格要求第2个破折号后面至少跟一个空格符(例如空格、tab、换行符等等)。该语法与标准SQL注释语法稍有不同。 从/*序…

mysql注释乱码问题_mysql注释是中文乱码怎么办

mysql注释是中文乱码的解决办法&#xff1a;首先用“show variables like”命令查看数据库与服务端的字符集设置&#xff1b;然后执行语句为“set collation_serverutf8_general_ci;”即可。 mysql表注释乱码 问题 执行语句: alter table TABLE_XXX comment ‘中文号’; 结果: …

wepy开发小程序eslint报错error 'getApp' is not defined no-undef

wepy开发小程序使用getApp().globalData保存全局数据很方便&#xff0c;但是会在控制台看到很多报错&#xff1a;“error getApp is not defined no-undef”&#xff0c;这是eslint报错。 解决办法&#xff1a;在.eslintrc.js文件中加入 globals: { getApp: true } 转载于:ht…

微信小程序 关于获取用户信息的一种方法 “this.setData与getApp().globalData.userInfo“

获取用户信息&#xff1a;this.setData和getApp().globalData.userInfo; 最开始的WXML文件中&#xff0c;我们写下页面结构代码如下&#xff1a; <image class"userinfo-avatar" src"{{userInfo.avatarUrl}}" mode"cover"></image>…

JS交互逻辑——获取页面数据{{}}和全局数据const app = getApp()

JS交互逻辑 在小程序里边&#xff0c;我们就通过编写 JS 脚本文件来处理用户的操作 app.js中最外层需要App({}) &#xff0c;该函数是微信平台提供的api App({// 全局数据&#xff0c;可以在所有的子页面中使用mydata: {n: 100} }) // 页面获取全局数据的方式,app表示小程序的…

微信小程序getApp().globalData.user无法获取值

一、debug过程 在进行微信小程序的开发过程中&#xff0c;我利用如下代码获取全局变量中的username的值&#xff0c;但其结果缺如图中所示的只向数据库中存入了对应的类型即object Object。 username: getApp().globalData.user.username, 数据库结果 其中&#xff0c;全局变量…

微信小程序const app=getApp()的作用,实现page页面获取全局数据

app.js的作用 app.js是整个小程序项目的入口文件&#xff0c; 如果小程序要运行&#xff0c;第一个被执行的文件就是app.js&#xff0c;第一个被执行的代码是app.js中的onLaunch方法 在app.js中可以书写小程序的全局业务逻辑 在app.js里面&#xff0c;写上一些需要的东西&am…

uniapp中的getApp().globalDate.

获取全局变量&#xff1a; getApp().globalDate1.uni-app 在app.vue文件export default里面定义globalData&#xff0c;在其他文件则用getApp&#xff08;&#xff09;.globalData获取 2.在当前文件&#xff08;app.vue&#xff09;里面获取globalData需要用this.$options.glob…

解释微信小程序const app=getApp()的作用

const appgetApp()用来获取全局变量 const appgetApp()这就话通常在pages下的页面的js中写 来调用app.js中的globalData{} 直白一点说就是在app.js的globalData{}里写的东西 在其他页面的js的onshow中可以直接调用 例&#xff1a;

微信小程序 app=getApp()公共变量在页面间传值技巧。

1.公共变量 在开发过程中&#xff0c;避免不了会使用公共变量&#xff0c;记录共享对象状态、数据最简单的方式就是创建创建公共变量&#xff1b; 当业务逻辑变多&#xff0c;还采用这种思想就会变得危险&#xff0c;代码逻辑变得不清晰&#xff0c;慢慢就有一种代码坏味道。 …