springboot 如何统计SQL执行情况?

1.情景展示

在项目运行过程中,为了监控项目的运行状况,除了日志之外,最好还能监控SQL的执行情况,如何实现?

2.具体分析

通过阿里的druid来实现。

Druid是阿里巴巴开发的号称为监控而生的数据库连接池,在功能、性能、扩展性方面,都超过其他数据库连接池,包括DBCP、C3P0、BoneCP、Proxool、JBoss DataSource等等等,秒杀一切。

Druid 可以很好的监控 DB 池连接和 SQL 的执行情况,天生就是针对监控而生的 DB 连接池。

功能介绍:

配置Druid数据源(连接池): 如同以前 c3p0、dbcp 数据源可以设置数据源连接初始化大小、最大连接数、等待时间、最小连接数 等一样,Druid 数据源同理可以进行设置;

配置 Druid web 监控 filter(WebStatFilter): 这个过滤器的作用就是统计 web 应用请求中所有的数据库信息,比如 发出的 sql 语句,sql 执行的时间、请求次数、请求的 url 地址、以及seesion 监控、数据库表的访问次数 等等。

配置 Druid 后台管理 Servlet(StatViewServlet): Druid 数据源具有监控的功能,并提供了一个 web 界面方便用户查看,类似安装 路由器 时,人家也提供了一个默认的 web 页面;需要设置 Druid 的后台管理页面的属性,比如 登录账号、密码 等;

3.解决方案

第一步:引入jar包;

<!--数据库连接池-->
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.1.23</version>
</dependency>

第二步:配置数据库连接池;

####spring配置####
spring:
  ###数据库配置
  datasource:
    ##要使用的连接池实现的全称
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      #最大连接数
      max-active: 5000
      #初始化大小
      initial-size: 10
      #最小连接数
      min-idle: 1
      #获取连接等待超时时间(单位:毫秒)
      max-wait: 60000
      #间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
      time-between-eviction-runs-millis: 60000
      #一个连接在池中最小生存的时间,单位是毫秒
      min-evictable-idle-time-millis: 30000
      #启用游标缓存
      pool-prepared-statements: true
      #最大可打开的游标数
      max-pool-prepared-statement-per-connection-size: 20
      #检验连接是否有效的查询语句。如果数据库Driver支持ping()方法,则优先使用ping()方法进行检查,否则使用validationQuery查询进行检查。(Oracle jdbc Driver目前不支持ping方法)
      validation-query: SELECT 1 FROM DUAL
      #应用向连接池申请连接,并且testOnBorrow为false时,连接池将会判断连接是否处于空闲状态,如果是,则验证这条连接是否可用
      test-while-idle: true
      #应用向连接池申请连接时,连接池会判断这条连接是否是可用的,默认值false
      test-on-borrow: false
      #当应用使用完连接,连接池回收连接的时候会判断该连接是否还可用,默认值false
      test-on-return: false
      #关闭自动重连
      connection-error-retry-attempts: 0
      break-after-acquire-failure: true

第三步:配置监控页面;

####spring配置####
spring:
  ###数据库配置
  datasource:
    ##druid配置
    druid:
      #配置监控统计拦截的filters,去掉后监控界面SQL无法进行统计,'wall'用于防火墙
      #值:config,stat,wall,log4j2(stat必须,否则监控不到SQL)
      filters: stat
      #配置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: localhost
        # 拒绝访问的地址,deny优先于allow,如果在deny列表中,就算在allow列表中,也会被拒绝
        #deny:

说明:我这里没有配置数据源!!!

第四步:查看监控页面。

启动项目后,访问/druid/login.html来到登录页面,输入用户名和密码完成登录。

SQL监控

可以查看的具体执行的SQL语句,可以展示的列进行排序。

慢SQL记录功能

我们可以把慢SQL记录到日志当中。

spring:
  datasource:
    druid:
      filter:
        stat:
          enabled: true         # 开启DruidDataSource状态监控
          db-type: mysql        # 数据库的类型
          log-slow-sql: true    # 开启慢SQL记录功能
          slow-sql-millis: 2000 # 默认3000毫秒,这里超过2s,就是慢,记录到日志

URL监控页面

spring监控页面

添加aop依赖

<!--SpringBoot 的aop 模块-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

在 application.yml 配置aop切入点,配置多个英文逗号分隔。

spring:
  datasource:
    druid:
      #这里配置你的dao层路径,多个使用逗号隔开,外层的双引号需要带上
      aop-patterns: "com.springboot.template.dao.*"

SQL防火墙页面

可以进行防御统计、表访问统计、函数调用统计、防御黑名单和白名单统计等。

第一:需要开启WebStatFilter。

spring:
  datasource:
    druid:
      ########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
      web-stat-filter:
        enabled: true                   # 启动 StatFilter
        url-pattern: /*                 # 过滤所有url
        exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*,/v2/api-docs,/swagger-resources,/doc.html" # 排除一些不必要的url

第二:启用的过滤需要加上wall。

spring:
  datasource:
    druid:
      #过滤器生效需要加上wall
      filters: stat,wall

session监控页面

第一:这个同样是需要开启WebStatFilter;

spring:
  datasource:
    druid:
      ########## 配置WebStatFilter,用于采集web关联监控的数据 ##########
      web-stat-filter:
        enabled: true                   # 启动 StatFilter
        session-stat-enable: true       # 开启session统计功能
        session-stat-max-count: 1000    # session的最大个数,默认100

第二:同样地,也和上面一样需要加上wall。

JSONAPI 页面

通过api的形式访问Druid的监控接口,api接口返回Json形式数据。

去除页面的广告

到本地仓库,按路径查找common.js;

com/alibaba/druid/1.1.23/druid-1.1.23.jar/support/http/resources/js/common.js

将this.buildFooter();删掉。

其它内容见文末推荐。

写在最后

  哪位大佬如若发现文章存在纰漏之处或需要补充更多内容,欢迎留言!!!

 相关推荐:

posted @ 2022-02-25 18:47  Marydon  阅读(555)  评论(0编辑  收藏  举报