SpringBoot 集成 Druid 数据源【SpringBoot系列3】

2,206

SpringCloud 大型系列课程正在制作中,欢迎大家关注与提意见。 程序员每天的CV 与 板砖,也要知其所以然,本系列课程可以帮助初学者学习 SpringBooot 项目开发 与 SpringCloud 微服务系列项目开发

1 项目准备

数据库连接池负责分配、管理和释放数据库连接,它允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个。

在Spring Boot 2.0版本中,默认数据库池技术已从Tomcat Pool切换到HikariCP,我们在启动项目后,访问数据查询,控制台日志可以输相关信息。 ,

Druid是阿里系提供的一个开源连接池,除在连接池之外,Druid还提供了非常优秀的数据库监控和扩展功能,所以在项目开发中一般会使用 Druid 。

2 Druid 简单介绍

Druid是阿里开源的一个JDBC应用组件,通过Druid连接池中间件, 可以实现的功能如下:

  • 监控数据库访问性能,通过StatFilter插件,详细统计SQL的执行性能
  • SQL执行日志,Druid提供了不同的LogFilter,能够支持Common-Logging、Log4j和JdkLog
  • 数据库密码加密。

打开pom文件,添加 druid 相关的 maven 依赖。

  <!-- https://mvnrepository.com/artifact/com.alibaba/druid-spring-boot-starter -->
  <!--        数据库连接池-->
  <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid-spring-boot-starter</artifactId>
      <version>1.2.16</version>
  </dependency>

需要注意 log4j 日志

   <dependency>
       <groupId>log4j</groupId>
       <artifactId>log4j</artifactId>
       <version>1.2.17</version>
   </dependency>

在 application.yml 中 把原有的数据源配置替换成 druid 数据源并配置数据源相关参数

spring:
  mvc:
    pathmatch:
      matching-strategy : ant-path-matcher
  datasource:
    name: druidDataSource
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      url: jdbc:mysql://mysql:3306/spring_boot?useUnicode=true&zeroDateTimeBehavior=convertToNull&autoReconnect=true&characterEncoding=utf-8&useSSL=false
      username: testadmin
      password: qwert.12345
      filters: stat,wall,log4j,config
      max-active: 100
      initial-size: 1
      max-wait: 60000
      min-idle: 1
      time-between-eviction-runs-millis: 60000
      min-evictable-idle-time-millis: 300000
      validation-query: select 'x'
      test-while-idle: true
      test-on-borrow: false
      test-on-return: false
      pool-prepared-statements: true
      max-open-prepared-statements: 50
      max-pool-prepared-statement-per-connection-size: 20
      filter:
        stat:
          log-slow-sql: true

2 配置Servlet和Filter

在config包中添加一个DruidConfig配置类。

import javax.servlet.Filter;
import javax.servlet.Servlet;
import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean;
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 com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.support.http.WebStatFilter;

@Configuration
public class DruidConfig {
    /**
     * 注册Servlet信息, 配置监控视图
     *
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
    public ServletRegistrationBean<Servlet> druidServlet() {
        ServletRegistrationBean<Servlet> servletRegistrationBean = new ServletRegistrationBean<Servlet>(new StatViewServlet(), "/druid/*");

        //白名单:
        servletRegistrationBean.addInitParameter("allow", "192.168.10.22");
        //IP黑名单 (存在共同时,deny优先于allow) : 如果满足deny的话提示:Sorry, you are not permitted to view this page.
        servletRegistrationBean.addInitParameter("deny", "192.168.1.119");
        //登录查看信息的账号密码, 用于登录Druid监控后台
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin");
        //是否能够重置数据.
        servletRegistrationBean.addInitParameter("resetEnable", "true");
        return servletRegistrationBean;

    }

    /**
     * 注册Filter信息, 监控拦截器
     *
     * @return
     */
    @Bean
    @ConditionalOnMissingBean
    public FilterRegistrationBean<Filter> filterRegistrationBean() {
        FilterRegistrationBean<Filter> filterRegistrationBean = new FilterRegistrationBean<Filter>();
        filterRegistrationBean.setFilter(new WebStatFilter());
        filterRegistrationBean.addUrlPatterns("/*");
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*");
        return filterRegistrationBean;
    }
}
2.1 配置监控拦截器
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;

import com.alibaba.druid.support.http.WebStatFilter;

/**
 * 配置监控拦截器, druid监控拦截器
 */
@WebFilter(filterName = "druidWebStatFilter",
        urlPatterns = "/*",
        initParams = {
                @WebInitParam(name = "exclusions",
                        value = "*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico,/druid/*"
                ), // 忽略资源
        })
public class DruidStatFilter extends WebStatFilter {

} 
2.2 配置Druid监控视图
import javax.servlet.annotation.WebInitParam;
import javax.servlet.annotation.WebServlet;
import com.alibaba.druid.support.http.StatViewServlet;

/**   
 * druid监控视图配置   
 */    
@WebServlet(urlPatterns = "/druid/*", initParams={    
    @WebInitParam(name="allow",value="192.168.6.195"),    // IP白名单 (没有配置或者为空,则允许所有访问)    
    @WebInitParam(name="deny",value="192.168.6.73"),    // IP黑名单 (存在共同时,deny优先于allow)    
    @WebInitParam(name="loginUsername",value="admin"),    // 用户名    
    @WebInitParam(name="loginPassword",value="admin"),    // 密码    
    @WebInitParam(name="resetEnable",value="true")    // 禁用HTML页面上的“Reset All”功能    
})   
public class DruidStatViewServlet extends StatViewServlet {  
    private static final long serialVersionUID = 7359758657306626394L;  
}  

3 启动项目

启动应用,访问: http://localhost:8899/druid/login.html, 端口对应项目中使用的端口,进入Druid监控后台页面。 在这里插入图片描述 然后 postman 访问一下 user/list 接口

在这里插入图片描述 然后在 druid 控制台就可以查看到对应的 监控数据 在这里插入图片描述 项目源码在这里 :gitee.com/android.lon… 有兴趣可以关注一下公众号:biglead

本文正在参加「金石计划」