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();删掉。
其它内容见文末推荐。
本文来自博客园,作者:Marydon,转载请注明原文链接:https://www.cnblogs.com/Marydon20170307/p/15937409.html