SpringBoot集成Druid实现监控功能的示例代码

 更新时间:2024年02月28日 08:53:18   作者:Spirit_NKlaus  
这篇文章主要介绍了SpringBoot集成Druid实现监控功能,Druid是阿里巴巴开发的号称为监控而生的数据库连接池,可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池,文中通过代码示例讲解非常详细,需要的朋友可以参考下

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。Druid可以很好的监控DB池连接和SQL的执行情况,天生就是针对监控而生的DB连接池。

官方的参考

https://github.com/alibaba/druid/wiki/%E5%B8%B8%E8%A7%81%E9%97%AE%E9%A2%98

一、传统web项目(如ssh,ssm)

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

使用xml或配置类配置好DruidDataSource

<!--使用druid数据源-->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" init-method="init">
        <!--注入连接属性-->
        <property name="driverClassName" value="xxx"/>
        <property name="url" value="xxx"/>
        <property name="username" value="xxx"/>
        <property name="password" value="xxx"/>
        <!--初始化连接池大小-->
        <property name="initialSize" value="5"></property>
        <!--设置最大连接数-->
        <property name="maxActive" value="20"></property>
        <!--设置等待时间-->
        <property name="maxWait" value="5000"/>
        <!--配置数据源监控的filter-->
        <property name="filters" value="stat"></property>
    </bean>

在web应用中的WEB-INF/web.xml中进行相关配置 

	<servlet>
		<servlet-name>StatViewServlet</servlet-name>
		<servlet-class>com.alibaba.druid.support.http.StatViewServlet</servlet-class>
		<!--登陆名-->
		<init-param>
			<param-name>loginUsername</param-name>
			<param-value>admin</param-value>
		</init-param>
		<!-- 登录密码-->
		<init-param>
			<param-name>loginPassword</param-name>
			<param-value>2024</param-value>
		</init-param>
		<!--白名单-->
		<init-param>
			<param-name>allow</param-name>
			<param-value></param-value>
		</init-param>
		<!--黑名单-->
		<init-param>
			<param-name>deny</param-name>
			<param-value></param-value>
		</init-param>
	</servlet>
	<servlet-mapping>
		<servlet-name>StatViewServlet</servlet-name>
		<url-pattern>/druid/*</url-pattern>
	</servlet-mapping>
 
	<filter>
		<filter-name>WebStatFilter</filter-name>
		<filter-class>com.alibaba.druid.support.http.WebStatFilter</filter-class>
		<!--过滤的样式-->
		<init-param>
			<param-name>exclusions</param-name>
			<param-value>*.js,*.gif,*.css,*.ico,*.jpg,*.png,/druid/*</param-value>
		</init-param>
	</filter>
	<filter-mapping>
		<filter-name>WebStatFilter</filter-name>
		<servlet-name>StatViewServlet</servlet-name>
	</filter-mapping>

二、springboot中引入原生的druid,依赖和上面一样,编写配置类即可

import com.alibaba.druid.filter.Filter;
import com.alibaba.druid.filter.stat.StatFilter;
import com.alibaba.druid.pool.DruidDataSource;
import com.alibaba.druid.support.http.StatViewServlet;
import com.alibaba.druid.wall.WallConfig;
import com.alibaba.druid.wall.WallFilter;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Primary;
 
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
 
@Configuration
public class DruidConfig {
 
    //登陆账号
    private final String USERNAME = "root";
    //登陆密码
    private final String PASSWORD = "123";
    @Value("${spring.datasource.url:#{null}}")
    private String dbUrl;
    @Value("${spring.datasource.username: #{null}}")
    private String username;
    @Value("${spring.datasource.password:#{null}}")
    private String password;
    @Value("${spring.datasource.driverClassName:#{null}}")
    private String driverClassName;
    /**
     * 以下属性可在配置文件自行定义
     */
    private Integer initialSize = 5;
    private Integer minIdle = 10;
    private Integer maxActive = 20;
    private Integer maxWait = 60000;
 
    @Bean
    @Primary
    public DruidDataSource dataSource() {
        DruidDataSource datasource = new DruidDataSource();
        datasource.setUrl(this.dbUrl);
        datasource.setUsername(username);
        datasource.setPassword(password);
        datasource.setDriverClassName(driverClassName);
        if (initialSize != null) {
            datasource.setInitialSize(initialSize);
        }
        if (minIdle != null) {
            datasource.setMinIdle(minIdle);
        }
        if (maxActive != null) {
            datasource.setMaxActive(maxActive);
        }
        if (maxWait != null) {
            datasource.setMaxWait(maxWait);
        }
        List<Filter> filters = new ArrayList<>();
        filters.add(statFilter());
        filters.add(wallFilter());
        datasource.setProxyFilters(filters);
        return datasource;
    }
 
    @Bean
    public ServletRegistrationBean druidServlet() {
        ServletRegistrationBean servletRegistrationBean = new ServletRegistrationBean();
        servletRegistrationBean.setServlet(new StatViewServlet());
        servletRegistrationBean.addUrlMappings("/druid/*");
        Map<String, String> initParameters = new HashMap<>();
        //禁用HTML页面上的“Rest All”功能
        initParameters.put("resetEnable", "false");
        //ip白名单(没配置则允许所有访问)
        //initParameters.put("allow", "");
        //ip黑名单,如果某个ip同时存在,deny优先于allow
        //initParameters.put("deny", "");
        initParameters.put("loginUsername", USERNAME);
        initParameters.put("loginPassword", PASSWORD);
        servletRegistrationBean.setInitParameters(initParameters);
        return servletRegistrationBean;
    }
 
    @Bean
    public StatFilter statFilter() {
        StatFilter statFilter = new StatFilter();
        //慢sql记录
        statFilter.setLogSlowSql(true);
        statFilter.setMergeSql(true);
        //超过多少时间为慢sql
        statFilter.setSlowSqlMillis(3000);
        return statFilter;
    }
 
    @Bean
    public WallFilter wallFilter() {
        WallFilter wallFilter = new WallFilter();
        //允许执行多条SQL
        WallConfig config = new WallConfig();
        config.setMultiStatementAllow(true);
        wallFilter.setConfig(config);
        return wallFilter;
    }
}

三、springboot druid starter方式

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

按需配置application.yml的内容

spring:
  datasource:
    url: ******
    username: ******
    password: ******
    driver-class-name: com.mysql.cj.jdbc.Driver
    type: com.alibaba.druid.pool.DruidDataSource  # 指定数据源类型
    ######### 连接池 配置 ##########
    druid:
      # 配置初始化大小、最小、最大
      initial-size: 5
      minIdle: 10
      max-active: 20
      # 配置获取连接等待超时的时间(单位:毫秒)
      max-wait: 60000
      # 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
#      time-between-eviction-runs-millis: 2000
      # 配置一个连接在池中最小生存的时间,单位是毫秒
#      min-evictable-idle-time-millis: 600000
#      max-evictable-idle-time-millis: 900000
      # 用来测试连接是否可用的SQL语句,默认值每种数据库都不相同,这是mysql
#      validationQuery: select 1
      # 应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用
#      testWhileIdle: true
      # 如果为true,默认是false,应用向连接池申请连接时,连接池会判断这条连接是否是可用的
#      testOnBorrow: false
      # 如果为true(默认false),当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用
#      testOnReturn: false
      # 是否缓存preparedStatement,也就是PSCache。PSCache对支持游标的数据库性能提升巨大,比如说oracle
#      poolPreparedStatements: true
      # 要启用PSCache,必须配置大于0,当大于0时, poolPreparedStatements自动触发修改为true,
      # 在Druid中,不会存在Oracle下PSCache占用内存过多的问题,
      # 可以把这个数值配置大一些,比如说100
#      maxOpenPreparedStatements: 20
      # 连接池中的minIdle数量以内的连接,空闲时间超过minEvictableIdleTimeMillis,则会执行keepAlive操作
#      keepAlive: true
      # Spring 监控,利用aop 对指定接口的执行时间,jdbc数进行记录
      aop-patterns: "com.springboot.template.dao.*"
      ########### 启用内置过滤器(第一个 stat必须,否则监控不到SQL)##########
      filters: stat,wall,log4j2
      # 自己配置监控统计拦截的filter
      filter:
        # 开启druiddatasource的状态监控
        stat:
          enabled: true
          db-type: mysql
          # 开启慢sql监控,超过2s 就认为是慢sql,记录到日志中
          log-slow-sql: true
          slow-sql-millis: 2000
        # 日志监控,使用slf4j 进行日志输出
#        slf4j:
#          enabled: true
#          statement-log-error-enabled: true
#          statement-create-after-log-enabled: false
#          statement-close-after-log-enabled: false
#          result-set-open-after-log-enabled: false
#          result-set-close-after-log-enabled: false
      ########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
      web-stat-filter:
        # 启动 StatFilter
        enabled: true
        # 过滤所有url
        url-pattern: /*
        # 排除一些不必要的url
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
        # 开启session统计功能
        session-stat-enable: true
        # session的最大个数,默认100
        session-stat-max-count: 1000
      ########## 配置StatViewServlet(监控页面),用于展示Druid的统计信息 ##########
      stat-view-servlet:
        # 启用StatViewServlet
        enabled: true
        # 访问内置监控页面的路径,内置监控页面的首页是/druid/index.html
        url-pattern: /druid/*
        # 不允许清空统计数据,重新计算
        reset-enable: false
        # 配置监控页面访问密码
        login-username: root
        login-password: 123
        # 允许访问的地址,如果allow没有配置或者为空,则允许所有访问
#        allow:
        # 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝
#        deny:

访问监控页面

页面简单介绍 

1、数据源页面:是当前DataSource配置的基本信息,上述配置的Filter可以在里面找到,如果没有配置Filter(一些信息会无法统计,例如“SQL监控”,会无法获取JDBC相关的SQL执行信息)。

2、SQL监控页面:统计了所有SQL语句的执行情况。

3、URL监控页面:统计了所有Controller接口的访问以及执行情况。

4、Spring 监控页面,利用aop 对指定接口的执行时间,jdbc数进行记录。

5、SQL防火墙页面:druid提供了黑白名单的访问,可以清楚的看到sql防护情况。

6、Session监控页面:可以看到当前的session状况,创建时间、最后活跃时间、请求次数、请求时间等详细参数。

7、JSONAPI 页面:通过api的形式访问Druid的监控接口,api接口返回Json形式数据。 

以上就是SpringBoot集成Druid实现监控功能的示例代码的详细内容,更多关于SpringBoot Druid监控的资料请关注脚本之家其它相关文章!

相关文章

  • Jenkins安装多个jdk版本并在项目中选择对应jdk版本

    Jenkins安装多个jdk版本并在项目中选择对应jdk版本

    在使用jenkins构建项目时会遇到不同的job需要配置不同版本的jdk,下面这篇文章主要给大家介绍了关于Jenkins安装多个jdk版本并在项目中选择对应jdk版本的相关资料,需要的朋友可以参考下
    2024-03-03
  • log4j2动态修改日志级别及拓展性使用详解

    log4j2动态修改日志级别及拓展性使用详解

    这篇文章主要介绍了log4j2动态修改日志级别及拓展性使用详解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-11-11
  • Java调用构造函数和方法及使用详解

    Java调用构造函数和方法及使用详解

    在Java编程中,构造函数用于初始化新创建的对象,而方法则用于执行对象的行为,构造函数在使用new关键字创建类实例时自动调用,没有返回类型,并且名称与类名相同,本文通过示例详细介绍了如何在Java中使用构造函数和方法,感兴趣的朋友一起看看吧
    2024-10-10
  • Spring JPA联表查询之注解属性详解

    Spring JPA联表查询之注解属性详解

    这篇文章主要为大家介绍了Spring JPA联表查询之注解属性示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-04-04
  • Java中Date数据类型的数值转换方式

    Java中Date数据类型的数值转换方式

    这篇文章主要介绍了Java中Date数据类型的数值转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • 详解使用IntelliJ IDEA新建Java Web后端resfulAPI模板

    详解使用IntelliJ IDEA新建Java Web后端resfulAPI模板

    这篇文章主要介绍了详解使用IntelliJ IDEA新建Java Web后端resfulAPI模板,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-08-08
  • Spring创建bean的几种方式及使用场景

    Spring创建bean的几种方式及使用场景

    本文主要介绍了Spring创建bean的几种方式及使用场景,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-04-04
  • MyBatis update标签详解

    MyBatis update标签详解

    这篇文章主要介绍了MyBatis update标签,使用 Map 传递参数会导致业务可读性的丧失,继而导致后续扩展和维护的困难,所以在实际应用中我们应该果断废弃该方式,需要的朋友可以参考下
    2023-10-10
  • 使用@ApiModel遇到的问题及解决

    使用@ApiModel遇到的问题及解决

    这篇文章主要介绍了使用@ApiModel遇到的问题及解决,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • SpringBoot详细介绍SPI机制示例

    SpringBoot详细介绍SPI机制示例

    这篇文章主要介绍了深入解析Spring Boot的SPI机制详情,SPI是JDK内置的一种服务提供发现机制,可以用来启用框架扩展和替换组件,主要用于框架中开发,更多相关介绍,感兴趣的小伙伴可以参考一下下面文章内容
    2022-08-08

最新评论