# sqlmonitor
**Repository Path**: chang_501/sqlmonitor
## Basic Information
- **Project Name**: sqlmonitor
- **Description**: 主要使用Mybatis的插件功能,完成SQL语句的监控,通知,存储等功能。快速定位慢SQL语句有哪个Mapper的哪个方法造成。
- **Primary Language**: Unknown
- **License**: Apache-2.0
- **Default Branch**: master
- **Homepage**: None
- **GVP Project**: No
## Statistics
- **Stars**: 3
- **Forks**: 1
- **Created**: 2023-03-17
- **Last Updated**: 2025-01-10
## Categories & Tags
**Categories**: Uncategorized
**Tags**: None
## README
# 集成Mybatis SQL监控 - SQLMonitor
主要使用Mybatis的插件功能,完成SQL语句的监控,通知,存储等功能。
快速定位慢SQL语句有哪个Mapper的哪个方法造成。
本文档主要Mybatis默认集成,使用配置文件配置,或者自己手动加入该插件。
如果使用Spring boot自动集成,参看[spring boot sqlMonitor集成](https://github.com/1997chang/sqlmonitor-spring-boot)
The SQL Monitor can help you quickly find SQL statement executor point with Mybatis. Because we hard find SQL statement from own application position in using Mybatis.
## 支持版本 [MyBatis 3.2.0+](https://github.com/mybatis/mybatis-3)
## 主要解决
当我们使用MySQL等其他数据库监控时,会告诉你完整的SQL语句的耗时信息。一般我们很难根据一条完整的SQL语句去定位由哪个Mapper的哪个方法造成的。因为Mapper文件中可能包含参数条件判断、迭代语句等,又或者在其他Mapper中有相似SQL语句。
当使用该插件时:会告诉你:完整的SQL语句,Mapper文件和方法、调用栈、执行时间等信息。
从而根据数据库监控中的SQL语句快速定位哪个Mapper的哪个方法造成,从而对Mapper中的SQL语句进行优化。
## 主要功能
### 记录SQL语句内容
1. 记录数据库的每一个CRUD操作内容。其中信息主要包含:完整的SQL语句,Mapper文件和方法、调用栈、执行时间等信息。然后使用指定的存储策略进行存储。
2. 可以存储在日志系统中,也可以存储在第三方持久层中。
3. 存储策略自带集成:Logger打印,ES存储。默认为Logger。也可以自己实现存储策略,只要实现`com.moxiao.sqlmonitor.store.StorePolicy`类
例如:日志记录内容。当DEBUG模式开启,将会额外打印执行栈的信息
```
SQL-Monitor检测到执行的SQL语句,StatementId:【com.example.mybatis.log.Count.count】SQL语句为:【select count(*)
from names】,开始执行时间:【2023-03-15 11:35:05】,耗时:【4】ms
```
### 通知慢SQL语句
1. 一条SQL语句的执行时间大于`executeTimeLimit`,则该SQL语句会被定位为慢SQL语句。使用指定的通知策略对慢SQL进行通知。
2. 通知方式有两种:
1. *SQL语句执行完进行的通知*。当SQL语句执行完,并且执行时间大于`executeTimeLimit`,使用指定的通知策略进行通知。
> 通知信息:
> 1. Mapper路径
> 2. 完整的SQL语句
> 3. 执行SQL语句总耗时
> 4. 执行SQL语句的栈内容
2. *定时监控进行的通知*。当SQL语句还没有完成,但该SQL语句已经执行时间大于`executeTimeLimit`,由定时监控进行通知。注意:定时监控的时间间隔为`slowSqlMonitor`。
> 通知信息:
> 1. 已经执行了时间,还没有执行完成
> 2. Mapper路径
> 3. 完整的SQL语句
> 4. 开始执行SQL语句时间
> 5. 执行SQL语句的栈内容
3. 通知策略自带:钉钉通知。也可以自己实现存储策略,只要实现`com.moxiao.sqlmonitor.notice.NoticePolicy`类
## 如何使用
### 1. 添加依赖
```xml
io.github.1997chang
sqlmonitor-mybatis
最新版本
```
注意:当使用钉钉进行通知的时候:如何配置钉钉机器人的配置信息依赖,还要添加okhttp3依赖,版本要求4.1.0以上
```xml
com.squareup.okhttp3
okhttp
4.9.3
```
### 2. 设置Mybatis插件
#### 2.1). 在MyBatis配置文件XML中配置拦截器插件
```xml
```
#### 2.2). 在Spring Bean的XML配置文件配置拦截器
```xml
params=value1
```
## 参数描述
1. **executeTimeLimit**:慢SQL语句阈值,默认5000ms,大于该值成为慢SQL
2. **slowSqlMonitor**:慢SQL监控定时任务的时间间隔,默认5000ms
3. **monitorStackPrefix**:执行栈匹配的前缀,满足该前缀的才会显示。从而减少执行栈显示的个数,配置从自己主项目的包名
4. **monitorStackClass**:执行栈匹配的类包名,配置为类的名称。即:将类的包名作为匹配的前缀
5. **maxStackLength**:执行栈的最大长度,默认30
6. **storePolicy**:SQL语句的存储策略,默认**LOGGER**。自带的可选参数有:ES,LOGGER。也可以是自提供的类名,要实现`com.moxiao.sqlmonitor.store.StorePolicy`类。如果有多个,中间逗号隔开。
7. **noticePolicy**:慢SQL的通知策略,默认**DINGDING**,自带的可选参数有:DINGDING。也可以是自提供的类名,要实现`com.moxiao.sqlmonitor.notice.NoticePolicy`。如果有多个,中间逗号隔开。
8. **esConfig**:ES配置
1. **uri**:ES的通信地址,带https或者http,多个中间用逗号隔开,
2. **username**:ES的用户名
3. **password**:ES的密码
4. **certFile**:ES证书的地址,ES8之后开始使用证书
5. **fingerPrint**:ES的指纹
6. **versionLessEleven**:ES版本是否低于7.11,不包含7.11。默认为FALSE
7. **numberOfShards**:分片的数量,默认为:3
8. **numberOfReplicas**:ES索引的备份数量,默认为:1
9. **indexName**:ES存储的索引名称,默认为:slow-sql-monitor
9. **dingdingConfig**:钉钉机器人
1. **secret**:钉钉机器人的秘钥
2. **accessToken**:钉钉机器人的token
3. **atMobiles**:钉钉@的人的手机号,多个用逗号隔开
4. **collectionAble**:钉钉通知是否进行收集。默认为FALSE。FALSE:一个慢SQL通知一次,TRUE:多个慢SQL合并通知一次,钉钉通知有限制。
5. **type**:钉钉通知的类型,默认MARKDOWN。可选参数TEXT,MARKDOWN。
10. **threadPoolConfig**:线程池配置
1. **corePoolSize**:核心线程池数量,默认为10
2. **keepAliveTime**:线程保持的时间,单位ms,默认为60_000
3. **queueCapacity**:阻塞队列的最大长度,默认为:Integer.MAX_VALUE
4. **rejectedExecutionPolicy**:拒绝执行的策略,默认为LOGGER,可选参数包含:ABORT,LOGGER,DISCARD,DISCARD_OLDEST,CALLER_RUNNER
5. **daemon**:是否守护线程,默认为TRUE
6. **waitTasksToCompleteOnShutdown**:是否等待任务完成之后关闭线程,默认FALSE
7. **awaitTerminationSeconds**:如果等待任务完成,则最大等待时间,默认为0