SpringBoot2 综合案例(12):集成Druid连接池,配置监控界面

本文介绍如何在SpringBoot2中整合Druid数据库连接池,包括配置核心依赖、数据源配置、核心配置类及简单测试。Druid连接池具有稳定性、完备监控信息和防SQL注入等功能。

Spring Boot 2 基础案例篇

包含:入门、日志管理、定时器、事务、AOP、数据库、缓存、NoSQL、监控、打包。

Spring Boot 2 高级案例篇

包含:整合常用中间件:分库分表、权限管理、Redis 集群、Dubbo、消息队列、定时器、搜索引擎、文件管理、邮件等

Druid 连接池

druid 简介

Druid 连接池是阿里巴巴开源的数据库连接池项目。Druid 连接池为监控而生,内置强大的监控功能,监控特性不影响性能。功能强大,能防 SQL 注入,内置 Loging 能诊断 Hack 应用行为。

Druid 连接池是阿里巴巴内部唯一使用的连接池,在内部数据库相关中间件 TDDL/DRDS 都内置使用强依赖了 Druid 连接池,经过阿里内部数千上万的系统大规模验证,经过历年双十一超大规模并发验证。

druid 特点
1)稳定性特性,阿里巴巴的业务验证2)完备的监控信息,快速诊断系统的瓶颈3)内置了 WallFilter 提供防 SQL 注入功能

整合 SpringBoot2 框架

引入核心依赖
<!-- 数据库依赖 --><dependency>    <groupId>mysql</groupId>    <artifactId>mysql-connector-java</artifactId>    <version>5.1.21</version></dependency><dependency>    <groupId>com.alibaba</groupId>    <artifactId>druid-spring-boot-starter</artifactId>    <version>1.1.13</version></dependency><!-- JDBC 依赖 --><dependency>    <groupId>org.springframework.boot</groupId>    <artifactId>spring-boot-starter-jdbc</artifactId></dependency>
数据源配置文件
spring:  application:    # 应用名称    name: node07-boot-druid  datasource:    type: com.alibaba.druid.pool.DruidDataSource    druid:      driverClassName: com.mysql.jdbc.Driver      url: jdbc:mysql://localhost:3306/data_one?useUnicode=true&characterEncoding=UTF8&zeroDateTimeBehavior=convertToNull&useSSL=false      username: root      password: 123      initial-size: 10      max-active: 100      min-idle: 10      max-wait: 60000      pool-prepared-statements: true      max-pool-prepared-statement-per-connection-size: 20      time-between-eviction-runs-millis: 60000      min-evictable-idle-time-millis: 300000      max-evictable-idle-time-millis: 60000      validation-query: SELECT 1 FROM DUAL      # validation-query-timeout: 5000      test-on-borrow: false      test-on-return: false      test-while-idle: true      connectionProperties: druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000      #filters: #配置多个英文逗号分隔(统计,sql 注入,log4j 过滤)      filters: stat,wall      stat-view-servlet:        enabled: true        url-pattern: /druid/*
核心配置类
import com.alibaba.druid.pool.DruidDataSource;import com.alibaba.druid.support.http.StatViewServlet;import com.alibaba.druid.support.http.WebStatFilter;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.beans.factory.annotation.Value;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 org.springframework.jdbc.core.JdbcTemplate;/** * Druid 数据库连接池配置文件 */@Configurationpublic class DruidConfig {    private static final Logger logger = LoggerFactory.getLogger(DruidConfig.class);    @Value("${spring.datasource.druid.url}")    private String dbUrl;    @Value("${spring.datasource.druid.username}")    private String username;    @Value("${spring.datasource.druid.password}")    private String password;    @Value("${spring.datasource.druid.driverClassName}")    private String driverClassName;    @Value("${spring.datasource.druid.initial-size}")    private int initialSize;    @Value("${spring.datasource.druid.max-active}")    private int maxActive;    @Value("${spring.datasource.druid.min-idle}")    private int minIdle;    @Value("${spring.datasource.druid.max-wait}")    private int maxWait;    @Value("${spring.datasource.druid.pool-prepared-statements}")    private boolean poolPreparedStatements;    @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")    private int maxPoolPreparedStatementPerConnectionSize;    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")    private int timeBetweenEvictionRunsMillis;    @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")    private int minEvictableIdleTimeMillis;    @Value("${spring.datasource.druid.max-evictable-idle-time-millis}")    private int maxEvictableIdleTimeMillis;    @Value("${spring.datasource.druid.validation-query}")    private String validationQuery;    @Value("${spring.datasource.druid.test-while-idle}")    private boolean testWhileIdle;    @Value("${spring.datasource.druid.test-on-borrow}")    private boolean testOnBorrow;    @Value("${spring.datasource.druid.test-on-return}")    private boolean testOnReturn;    @Value("${spring.datasource.druid.filters}")    private String filters;    @Value("{spring.datasource.druid.connection-properties}")    private String connectionProperties;    /**     * Druid 连接池配置     */    @Bean     //声明其为 Bean 实例    public DruidDataSource dataSource() {        DruidDataSource datasource = new DruidDataSource();        datasource.setUrl(dbUrl);        datasource.setUsername(username);        datasource.setPassword(password);        datasource.setDriverClassName(driverClassName);        datasource.setInitialSize(initialSize);        datasource.setMinIdle(minIdle);        datasource.setMaxActive(maxActive);        datasource.setMaxWait(maxWait);        datasource.setTimeBetweenEvictionRunsMillis(timeBetweenEvictionRunsMillis);        datasource.setMinEvictableIdleTimeMillis(minEvictableIdleTimeMillis);        datasource.setMaxEvictableIdleTimeMillis(minEvictableIdleTimeMillis);        datasource.setValidationQuery(validationQuery);        datasource.setTestWhileIdle(testWhileIdle);        datasource.setTestOnBorrow(testOnBorrow);        datasource.setTestOnReturn(testOnReturn);        datasource.setPoolPreparedStatements(poolPreparedStatements);        datasource.setMaxPoolPreparedStatementPerConnectionSize(maxPoolPreparedStatementPerConnectionSize);        try {            datasource.setFilters(filters);        } catch (Exception e) {            logger.error("druid configuration initialization filter", e);        }        datasource.setConnectionProperties(connectionProperties);        return datasource;    }    /**     * JDBC 操作配置     */    @Bean(name = "dataOneTemplate")    public JdbcTemplate jdbcTemplate (@Autowired DruidDataSource dataSource){        return new JdbcTemplate(dataSource) ;    }    /**     * 配置 Druid 监控界面     */    @Bean    public ServletRegistrationBean statViewServlet(){        ServletRegistrationBean srb =                new ServletRegistrationBean(new StatViewServlet(),"/druid/*");        //设置控制台管理用户        srb.addInitParameter("loginUsername","root");        srb.addInitParameter("loginPassword","root");        //是否可以重置数据        srb.addInitParameter("resetEnable","false");        return srb;    }    @Bean    public FilterRegistrationBean statFilter(){        //创建过滤器        FilterRegistrationBean frb =                new FilterRegistrationBean(new WebStatFilter());        //设置过滤器过滤路径        frb.addUrlPatterns("/*");        //忽略过滤的形式        frb.addInitParameter("exclusions",                "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");        return frb;    }}
简单测试类
@RestControllerpublic class DruidController {    private static final Logger LOG = LoggerFactory.getLogger(DruidController.class);    @Resource    private JdbcTemplate jdbcTemplate ;    @RequestMapping("/druidData")    public String druidData (){        String sql = "SELECT COUNT(1) FROM d_phone" ;        Integer countOne = jdbcTemplate.queryForObject(sql,Integer.class) ;        // countOne==2        LOG.info("countOne=="+countOne);        return "success" ;    }}

监控效果图解

完成一次数据请求后,访问如下链接。在这里插入图片描述

http://localhost:8007/druid输入配置的用户名和密码:root root
Druid 监控首页

主要展示链接数据库的基础信息。在这里插入图片描述

Druid 监控数据源

连接池配置的各项详细属性,可以参考这里查看,无需再从网上查找。在这里插入图片描述

Druid 监控 SQL 执行

所有执行的 SQL,都会在这里被监控到,且会有 SQL 执行的详细计划。在这里插入图片描述

源代码地址

GitHub·地址https://github.com/cicadasmile/spring-boot-baseGitEE·地址https://gitee.com/cicadasmile/spring-boot-base

本文首发于 GitChat,未经授权不得转载,转载需与 GitChat 联系。

阅读全文: http://gitbook.cn/gitchat/activity/5d7e2d5ae5a77a6ad31da6cf

您还可以下载 CSDN 旗下精品原创内容社区 GitChat App ,阅读更多 GitChat 专享技术内容哦。

FtooAtPSkEJwnW-9xkCLqSTRpBKX

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值