MyBatis-Plus - 高級功能——SQL性能分析打印插件

一、引言

在我們日常開發工作當中,避免不了查看當前程序所執行的SQL語句,便於程序員排憂解難吶。

MP提供了兩種方式,用於輸出每條SQL語句及其執行時間,針對執行較長時間的SQL可以停止運行,有助於發現問題。

這兩種方式只適用於開發環境,不建議生產環境使用。

 

二、性能分析插件

該插件 3.2.0 以上版本移除,推薦使用第二種方式(執行SQL分析打印)方式。

步驟一:在MP配置類中配置該插件,並且只適用於DEV環境

/**
 * @Auther: IT賤男
 * @Date: 2019/6/12 15:06
 * @Description: MybatisPlus配置類
 */
@Configuration
public class MyBatisPlusConfig {
 
    /**
     * SQL執行效率插件
     *
     * @return
     */
    @Bean
    @Profile({"dev"}) // 指定環境爲dev生效
    public PerformanceInterceptor performanceInterceptor() {
        PerformanceInterceptor interceptor = new PerformanceInterceptor();
        // sql美化打印
        interceptor.setFormat(true);
        // 設置SQL超時時間
        interceptor.setMaxTime(5000L);
        return interceptor;
    }
}

步驟二:設置環境爲dev,可以在yml如下配置,或者直接測試類中也是可以設置的,如圖。

spring:
  profiles:
    active: dev

步驟三:測試測試,在控制檯中打印selectList這個方法執行了32 ms,同時也打印了最後執行的sql語句。

@Test
public void select(){
    List<User> users = userMapper.selectList(Wrappers.<User>lambdaQuery().eq(User::getAge, 18));
    users.forEach(System.out::println);
}
DEBUG==>  Preparing: SELECT id,login_name,name,password,email,salt,sex,age,phone,user_type,status,organization_id,create_time,update_time,version FROM sys_user WHERE is_delete='0' AND age = ? 
DEBUG==> Parameters: 18(Integer)
DEBUG<==      Total: 0
 Time:35 ms - ID:com.example.demo.mapper.UserMapper.selectList
Execute SQL:
    SELECT
        id,
        login_name,
        name,
        password,
        email,
        salt,
        sex,
        age,
        phone,
        user_type,
        status,
        organization_id,
        create_time,
        update_time,
        version 
    FROM
        sys_user 
    WHERE
        is_delete='0' 
        AND age = 18

 

三、執行SQL分析打印

這個功能依賴p6spy組件,完美的輸出打印SQL以及執行時長,支持MP3.1.0以上版本。

步驟一:引入p6spy的maven依賴

<!--SQL 分析打印-->
<dependency>
    <groupId>p6spy</groupId>
    <artifactId>p6spy</artifactId>
    <version>3.8.2</version>
</dependency>

步驟二:更改yml連接數據庫配置,主要修改driver-class-name、url中jdbc後需要加上p6spy

spring:
  datasource:
    driver-class-name: com.p6spy.engine.spy.P6SpyDriver
    url: jdbc:p6spy:mysql://127.0.0.1:3360/test?userSSL=false
    username: root
    password: 123456
  profiles:
    active: dev

步驟三:新增spy.properties文件,內容如下,可以根據需求相對應的修改文件。

module.log=com.p6spy.engine.logging.P6LogFactory,com.p6spy.engine.outage.P6OutageFactory

# 自定義日誌打印
logMessageFormat=com.baomidou.mybatisplus.extension.p6spy.P6SpyLogger
 
#日誌輸出到控制檯,解開註釋就行了
# appender=com.baomidou.mybatisplus.extension.p6spy.StdoutLogger
 
# 指定輸出文件位置
logfile=sql.log
 
# 使用日誌系統記錄 sql
#appender=com.p6spy.engine.spy.appender.Slf4JLogger

# 設置 p6spy driver 代理
deregisterdrivers=true

# 取消JDBC URL前綴
useprefix=true

# 配置記錄 Log 例外,可去掉的結果集有error,info,batch,debug,statement,commit,rollback,result,resultset.
excludecategories=info,debug,result,batch,resultset

# 日期格式
dateformat=yyyy-MM-dd HH:mm:ss

# 實際驅動可多個
#driverlist=org.h2.Driver

# 是否開啓慢SQL記錄
outagedetection=true

# 慢SQL記錄標準 2 秒
outagedetectioninterval=2

步驟四:輸出文件格式內容如下

 Consume Time:15 ms 2019-09-20 11:50:31
 Execute SQL:SELECT id,login_name,name,password,email,salt,sex,age,phone,user_type,status,organization_id,create_time,update_time,version FROM sys_user WHERE is_delete='0' AND age = 18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章