前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >SpringBoot配置Druid

SpringBoot配置Druid

原创
作者头像
一百减一是零
发布于 2024-08-19 02:07:07
发布于 2024-08-19 02:07:07
24600
代码可运行
举报
文章被收录于专栏:数据库连接池数据库连接池
运行总次数:0
代码可运行

我们经常使用的springboot自带的 Hikari,今天我们看下Druid有什么不同

自己做一个练练手,一起来看看Druid强大之处

1.新建一个springboot项目,建好之后别忘记yml中配置启动端口

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#启动端口
server:
  port: 8088

配置好之后,验证看下是否正常,写个测试类

代码语言:java
AI代码解释
复制
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
@RestController
@RequestMapping("/test")
public class TestController {
    @RequestMapping("/helloWord")
    public String HelloWord(){
        System.out.println("hello java");
        return "hello java";
    }
}

2.启动项目

显示刚刚自己设置的端口号,启动成功,然后访问下看看是否正常

OK,启动和访问都没有问题。 

3.引入对应的依赖包,版本的话看个人需求 我用的是2.2.4,数据库我用的是postgresql

代码语言:xml
AI代码解释
复制
 <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.4.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
<dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
            <scope>runtime</scope>
        </dependency>
<!--引入druid starter-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.16</version>
        </dependency>
 
 <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.2.16</version>
        </dependency>

4.配置application.yml

代码语言:yml
AI代码解释
复制
#启动端口
server:
  port: 8088
 
 
#druid细节配置可以写在yml中,也可以代码实现。我这版是代码实现的
 
spring:
  datasource:
    url: 连接地址
    username: 账号
    password: 密码
    driver-class-name: org.postgresql.Driver
    type: com.alibaba.druid.pool.DruidDataSource #切换为druid

5.配置DruidConfiguration

代码语言:java
AI代码解释
复制
 
import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import lombok.extern.slf4j.Slf4j;
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.SQLException;
import java.util.*;
 
/**
 * SpringBoot配置Druid
 */
 
 
@Slf4j
@Configuration
public class DruidConfiguration {
 
    @ConfigurationProperties("spring.datasource")
    @Bean
    public DataSource druidDataSource() {
        DruidDataSource dataSource = new DruidDataSource();
        try {
            // 启动程序时,在连接池中初始化多少个连接(10-50已足够)
            dataSource.setInitialSize(50);
            // 回收空闲连接时,将保证至少有 minIdle 个连接(与 initialSize 相同)
            dataSource.setMinIdle(50);
            // 连接池中最多支持多少个活动会话
            dataSource.setMaxActive(10000);
            // 程序向连接池中请求连接时,超过 maxWait 的值后,认为本次请求失败,即连接池,没有可用连接,单位毫秒,设置 -1 时表示无限等待(建议值为100)
            dataSource.setMaxWait(100);
            /*
                缓存通过以下两个方法发起的 SQL:
                public PreparedStatement prepareStatement(String sql)
                public PreparedStatement prepareStatement(String sql, int resultSetType, int resultSetConcurrency)
                (建议值为 true)
             */
            dataSource.setPoolPreparedStatements(true);
            // 每个连接最多缓存多少个 SQL(建议值为 20)
            dataSource.setMaxPoolPreparedStatementPerConnectionSize(20);
            // 检查空闲连接的频率,单位毫秒,非正整数时表示不进行检查(建议值:2000)
            dataSource.setTimeBetweenEvictionRunsMillis(2000);
            // 连接池中某个连接的空闲时长达到 N 毫秒后, 连接池在下次检查空闲连接时,将回收该连接,要小于防火墙超时设置 net.netfilter.nf_conntrack_tcp_timeout_established 的设置
            dataSource.setMinEvictableIdleTimeMillis(600000);
            // 配置一个连接在池中最大生存的时间,单位是毫秒
            dataSource.setMaxEvictableIdleTimeMillis(900000);
            // 程序没有 close 连接且空闲时长超过 minEvictableIdleTimeMillis,则会执行 validationQuery 指定的 SQL,以保证该程序连接不会池 kill 掉,其范围不超过 minIdle 指定的连接个数(建议值为 true)
            dataSource.setKeepAlive(true);
            // 检查池中的连接是否仍可用的 SQL 语句,druid 会连接到数据库执行该 SQL,如果正常返回,则表示连接可用,否则表示连接不可用
            dataSource.setValidationQuery("SELECT 1");
            // 当程序请求连接,池在分配连接时,是否先检查该连接是否有效(高效,并且保证安全性;建议值为 true)
            dataSource.setTestWhileIdle(true);
            // 程序申请连接时,进行连接有效性检查(低效,影响性能;建议值为 false)
            dataSource.setTestOnBorrow(false);
            // 程序返还连接时,进行连接有效性检查(低效,影响性能;建议值为 false)
            dataSource.setTestOnReturn(false);
            // 物理连接初始化的时候执行的 sql
//            Collection<String> connectionInitSqls = new ArrayList<>(10);
//            connectionInitSqls.add("SELECT 1 FROM DUAL");
//            dataSource.setConnectionInitSqls(connectionInitSqls);
            /*
                这里配置的是插件,常用的插件有:
                监控统计:stat
                日志监控:log4j2
                防御 SQL 注入:wall
             */
            dataSource.setFilters("stat,log4j2");
            // 是否合并多个 DruidDataSource 的监控数据
            dataSource.setUseGlobalDataSourceStat(true);
            // 监控统计
            // 是否启用慢 SQL 记录
            dataSource.addConnectionProperty("druid.stat.logSlowSql", "true");
            // 执行时间超过 slowSqlMillis 的就是慢,单位毫秒(建议值 500)
            dataSource.addConnectionProperty("druid.stat.slowSqlMillis", "500");
            // 要求程序从池中 get 到连接后,N 秒后必须 close,否则 druid 会强制回收该连接,不管该连接中是活动还是空闲,以防止进程不会进行 close 而霸占连接(建议值为 false,当发现程序有未正常 close 连接时设置为 true)
//            dataSource.setRemoveAbandoned(false);
            // 设置 druid 强制回收连接的时限,当程序从池中 get 到连接开始算起,超过此值后,druid将强制回收该连接,单位秒(应大于业务运行最长时间)
//            dataSource.setRemoveAbandonedTimeout();
            // 当 druid 强制回收连接后,是否将 stack trace 记录到日志中(建议值为 true)
//            dataSource.setLogAbandoned(true);
            // 连接属性。比如设置一些连接池统计方面的配置 druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
//            dataSource.setConnectProperties();
 
            // 防御 SQL 注入
            WallFilter wallFilter = new WallFilter();
            WallConfig config = new WallConfig();
            // 是否允许执行 DELETE 语句(建议值为 false)
            config.setDeleteAllow(false);
            // 是否允许删除表(建议值为 false)
            config.setDropTableAllow(false);
            wallFilter.setConfig(config);
 
            // 插件代理
            List<Filter> proxyFilters = new ArrayList<>(10);
            proxyFilters.add(wallFilter);
            dataSource.setProxyFilters(proxyFilters);
 
        } catch (SQLException e) {
            log.error(e.toString());
        }
        return dataSource;
    }
 
    @Bean
    public ServletRegistrationBean<StatViewServlet> statViewServlet() {
        // 监控信息显示页面
        StatViewServlet statViewServlet = new StatViewServlet();
        // 访问监控信息显示页面的 url 路径(建议值为 /druid/* )
        String urlPattern = "/druid/*";
 
        ServletRegistrationBean<StatViewServlet> bean = new ServletRegistrationBean<>(statViewServlet, urlPattern);
 
        Map<String, String> initParams = new HashMap<>();
        // 是否允许清空统计数据
        initParams.put("resetEnable", "false");
        // 登录监控信息显示页面的用户名
        initParams.put("loginUsername", "admin");
        // 登录监控信息显示页面的密码
        initParams.put("loginPassword", "admin");
        // 允许访问控制(格式:ip地址、ip地址/子网掩码位数)逗号分隔多个地址
        initParams.put("allow", "127.0.0.1");
        // 拒绝访问控制(格式:ip地址、ip地址/子网掩码位数)逗号分隔多个地址
//        initParams.put("deny", "");
 
        bean.setInitParameters(initParams);
        return bean;
    }
 
    @Bean
    public FilterRegistrationBean<WebStatFilter> webStatFilter() {
        FilterRegistrationBean<WebStatFilter> bean = new FilterRegistrationBean<>();
        // 网络监控过滤器(用于采集 web-jdbc 关联监控的数据)
        bean.setFilter(new WebStatFilter());
        // 过滤所有的 url 路径
        Collection<String> urlPatterns = new ArrayList<>();
        urlPatterns.add("/*");
        bean.setUrlPatterns(urlPatterns);
 
        Map<String, String> initParams = new HashMap<>();
        // 排除不必要采集的 url 路径,以逗号“,”分割
        initParams.put("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,*.map,/druid/*");
        // 是否使用 session 监控功能
        initParams.put("sessionStatEnable", "true");
        // 是否使用 session 监控最大数量(默认是1000)
        initParams.put("sessionStatMaxCount", "1000");
        // 使得 druid 能够知道当前的 session 的用户是谁,根据需要,把改值修改为你 user 信息保存在 session 中的 sessionName
        initParams.put("principalSessionName", "session_user_key");
        // 如果你的 user 信息保存在 cookie 中,你可以配置 principalCookieName,使得 druid 知道当前的 user 是谁,根据需要,把该值修改为你 user 信息保存在 cookie 中的 cookieName
        initParams.put("principalCookieName", "cookie_user_key");
        // 是否监控单个 url 调用的 sql 列表
        initParams.put("profileEnable", "true");
        bean.setInitParameters(initParams);
        return bean;
    }
}

6.验证下连接数据库是否正常

新建表,写入数据(这些我就不一一阐述了)。同学们可以自己操作下。

我的项目结构

我找了一张表,写一个Controller我们查下看看是否可以正常查询

代码语言:java
AI代码解释
复制
 
 
import com.yun.greedy.modules.staff.entity.yUser;
import com.yun.greedy.modules.staff.service.StaffService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
 
import java.util.List;
 
@RestController
@RequestMapping("/staff")
public class StaffController {
 
    @Autowired
    private StaffService staffService;
 
    @RequestMapping("/list")
    public String list() {
        List<yUser> list = staffService.getBaseMapper().selectList(null);
        list.forEach(System.out::println);
        return "查询完成";
    }
}

验证连接数据库查询成功!

7.查看Druid的监控信息

登录此地址http://localhost:8088/druid/login.html

账号密码是ServletRegistrationBean中的配置admin        admin

登录成功之后就可以查看各种的监控信息了

对于Druid连接池自带的监控,主要包括以下几个方面:

监控数据统计:Druid连接池内置了丰富的监控指标,可以统计连接池的使用情况、连接池的性能指标、SQL执行情况等。通过Druid的监控数据统计,可以方便地了解连接池的状态和性能。

SQL监控:Druid连接池可以记录SQL执行的详细信息,包括SQL语句、执行时间、执行结果等。通过Druid的SQL监控,可以方便地分析和优化SQL语句的性能。

防火墙功能:Druid连接池内置了防火墙功能,可以对SQL进行实时的监控和过滤,防止恶意的SQL攻击。

监控界面:Druid连接池提供了一个Web界面,可以直观地查看连接池的状态和性能指标,方便进行监控和管理。

好了,到这里就是完成了,有兴趣的同学可以自己尝试一下呃。更强大的功能可以参考下官网

mirrors / alibaba / druid · GitCode

🚀 Github 镜像仓库 🚀 源项目地址 ⬇ ⬇

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
十.SpringBoot配置Druid连接池
     连接池的作用是为了提高性能,将已经创建好的连接保存在池中,当有请求来时,直接使用已经创建好的连接对Server端进行访问。这样省略(复用)了创建连接和销毁连接的过程(TCP连接建立时的三次握手和销毁时的四次握手),从而在性能上得到了提高。Druid是一个JDBC组件,它包括三部分:DruidDriver 代理Driver,能够提供基于Filter-Chain模式的插件体系、DruidDataSource 高效可管理的数据库连接池、SQLParser。可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。
十分钟空间
2022/08/17
5.2K0
十.SpringBoot配置Druid连接池
整合Druid—SpringBoot[通俗易懂]
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池。
全栈程序员站长
2022/09/15
1.3K0
SpringBoot整合Druid 1.2.8 2022年5月9日最新
由于Druid不断升级,导致很多的配置都发生了不同的变化,使用老配置会导致一些监控失效。本文存在的意义就是记录一个可用的版本,后面升级均可参考本文进行修改
收心
2022/05/11
1.3K0
springboot整合druid数据源并开启druid后台监控
springboot整合druid数据源并开启druid后台监控 1、引入依赖 2、application.yml文件: 3、编写配置文件: 1、SprinbBoot1.x版本 2、SpringBoot2.x版本: 4、运行测试 4.1 访问:`http://localhost:8080/druid` 4.2 输入代码里面写的admin和123456 4.3 写个controller测试: 4.4 访问:`http://localhost:8080/query` 4.5 **再次查看druid的SQL
别团等shy哥发育
2023/02/25
1.7K0
springboot整合druid数据源并开启druid后台监控
SpringBoot集成Druid连接池
https://www.cnblogs.com/noneplus/p/11528129.html
Noneplus
2019/09/24
1.1K0
SpringBoot集成Druid连接池
springboot之整合druid并配置数据源监控
这里使用druid的jar,当然springboot也有其自己的druid启动器:
西西嘛呦
2020/08/26
6690
springboot之整合druid并配置数据源监控
Java之SpringBoot自定义配置与整合Druid
这篇文章主要介绍的是java之SpringBoot自定义配置与整合Druid的相关资料,关于SpringBoot配置文件可以是properties或者是yaml格式的文件,但是在SpringBoot加载application配置文件时是存在一个优先级,下面小编就和大家一起进入文章学习这项
米米素材网
2022/07/30
9430
Java之SpringBoot自定义配置与整合Druid
Druid 连接池 监控 & SpringBoot 整合
步骤 简述:pom文件去除原有依赖,添加 log4j2.xml ,配置 application.yml 文件
收心
2022/02/14
1.8K0
Druid 连接池 监控 & SpringBoot 整合
SpringBoot整合Druid「建议收藏」
Github地址:https://github.com/alibaba/druid/ com.alibaba.druid.pool.DruidDataSource 基本配置参数 如下:
全栈程序员站长
2022/09/15
7050
springboot系列学习(十九):springboot项目整合Druid,Druid到底是什么,他是在项目中如何使用的
Druid总结就是一个数据库的连接池,就是这个池子里面有很多的数据库的链接的对象,我们可以从这个池子里面拿出一个对象进行操作数据库,不用了放到这个池子里面。Druid就是一个池子。
一写代码就开心
2020/11/20
2.8K0
springboot系列学习(十九):springboot项目整合Druid,Druid到底是什么,他是在项目中如何使用的
SpringBoot整合jsp,Druid数据监控,与Shiro,快速为实体类添加相应方法
一.在SpringBoot项目中, 如何能够使用并运行Jsp页面? 1.添加相应jar包坐标 <dependency> <groupId>javax.servletgroupId> <
时间静止不是简史
2021/03/04
7780
SpringBoot整合jsp,Druid数据监控,与Shiro,快速为实体类添加相应方法
Springboot 系列(九)使用 Spring JDBC 和 Druid 数据源监控
作为一名 Java 开发者,相信对 JDBC(Java Data Base Connectivity)是不会陌生的,JDBC作为 Java 基础内容,它提供了一种基准,据此可以构建更高级的工具和接口,使数据库开发人员能够编写数据库应用程序。下面演示下 Springboot 中如何使用 JDBC 操作,并配置使用 Druid 连接池,体验 Druid 对数据库操作强大的监控和扩展功能。Alibaba-Durid 官方手册点这里。
未读代码
2019/11/04
1.6K0
Druid 的整合
Java 中常用的数据库连接池有 C3P0、Hikari、Druid 等。数据库的连接池,对于整个项目的性能还是很关键的,因此所有的 Java 项目当中都会使用数据库连接池。在 Java 的各种数据库连接池中,Druid 是阿里巴巴推出的开源的、号称最好用数据库连接池,它提供了强大的监控和扩展功能。Druid 在 github 的地址如下:
码农UP2U
2020/10/14
5640
Druid 的整合
SpringBoot与数据访问-JDBC
默认是用org.apache.tomcat.jdbc.pool.DataSource作为数据源;
程序员阿杜
2021/03/16
3680
SpringBoot之druid
访问:http://localhost:8080/druid/login.html即可
王念博客
2019/07/25
6310
Spring Boot 整合Druid
等待maven自动导入后,我们在External Libraries这里能看到这个Druid的全部源码
LCyee
2020/08/05
1.7K0
Spring Boot 整合Druid
SpringBoot2.0 基础案例(07):集成Druid连接池,配置监控界面
Druid连接池是阿里巴巴开源的数据库连接池项目。Druid连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防SQL注入,内置Loging能诊断Hack应用行为。 Druid连接池是阿里巴巴内部唯一使用的连接池,在内部数据库相关中间件TDDL/DRDS 都内置使用强依赖了Druid连接池,经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证。
知了一笑
2019/07/19
1.2K0
一文读懂SpringBoot持久层开发原理
SpingBoot持久层开发原理 1. JDBC “SpringBoot关于数据库的配置都存在于org.springframework.boot.autoconfigure.jdbc 关于数据库的相关配置存放于DataSourceProperties中 @ConfigurationProperties( prefix = "spring.datasource" ) public class DataSourceProperties implements BeanClassLoaderAware, I
石的三次方
2021/01/05
9800
【Spring Boot】009-Spring Boot整合Druid数据源
Java程序很大一部分要操作数据库,为了提高性能操作数据库的时候,又不得不使用数据库连接池;
訾博ZiBo
2025/01/06
970
【Spring Boot】009-Spring Boot整合Druid数据源
SpringBoot重点详解–使用Druid+Jpa
Druid有以下优点: 1) 可以监控数据库访问性能,Druid内置提供了一个功能强大的StatFilter插件,能够详细统计SQL的执行性能,这对于线上分析数据库访问性能有帮助。 2) 替换DBCP和C3P0,Druid提供了一个高效、功能强大、可扩展性好的数据库连接池。 3) 数据库密码加密。直接把数据库密码写在配置文件中,这是不好的行为,容易导致安全问题。DruidDriver和DruidDataSource都支持PasswordCallback。 4) SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog,你可以按需要选择相应的LogFilter,监控你应用的数据库访问情况。 5) 扩展JDBC,如果你要对JDBC层有编程的需求,可以通过Druid提供的Filter-Chain机制,很方便编写JDBC层的扩展插件。
全栈程序员站长
2022/09/15
9820
推荐阅读
相关推荐
十.SpringBoot配置Druid连接池
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验