最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Mybatis統(tǒng)計sql運(yùn)行時間的兩種方式

 更新時間:2024年11月04日 11:03:28   作者:知楠行易  
這篇文章主要介紹了Mybatis統(tǒng)計sql運(yùn)行時間的方案,Spring?Boot?+?Mybatis?web項目,統(tǒng)計sql運(yùn)行時間,用于分析慢sql,優(yōu)化系統(tǒng)速度,方案有兩種:自定義實(shí)現(xiàn)?Interceptor和使用現(xiàn)有依賴庫(Druid),文中通過代碼示例講解的非常詳細(xì),需要的朋友可以參考下

需求:

Spring Boot + Mybatis web項目,統(tǒng)計sql運(yùn)行時間,用于分析慢sql,優(yōu)化系統(tǒng)速度。

方案有兩種:

  • 自定義實(shí)現(xiàn) Interceptor ,更加靈活。
  • 使用現(xiàn)有依賴庫(Druid):優(yōu)點(diǎn)是簡單好上手,但是統(tǒng)計的只有sql 信息 沒有調(diào)用參數(shù)信息。

一、Mybatis 原生攔截器

在 MyBatis 中記錄 SQL 查詢的執(zhí)行時間和 SQL 語句,可以使用 MyBatis 的攔截器(Interceptor)。通過實(shí)現(xiàn)自定義攔截器,你可以捕獲 SQL 執(zhí)行的開始時間和結(jié)束時間,從而計算出執(zhí)行時間,并將 SQL 語句記錄到日志中。

  • 自定義攔截器,示例:
import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.plugin.*;
import org.apache.ibatis.session.ResultHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.logging.Log;
import org.apache.ibatis.logging.LogFactory;

import java.sql.Statement;
import java.util.Properties;

@Intercepts({
    @Signature(type = StatementHandler.class, method = "query", args = {Statement.class, ResultHandler.class}),
    @Signature(type = StatementHandler.class, method = "update", args = {Statement.class}),
    @Signature(type = StatementHandler.class, method = "batch", args = {Statement.class})
})
public class SqlExecutionInterceptor implements Interceptor {

    private static final Log logger = LogFactory.getLog(SqlExecutionInterceptor.class);

    @Override
    public Object intercept(Invocation invocation) throws Throwable {
        // 獲取 SQL 語句
        StatementHandler statementHandler = (StatementHandler) invocation.getTarget();
        BoundSql boundSql = statementHandler.getBoundSql();
        String sql = boundSql.getSql().replaceAll("\\s+", " ").trim();

        // 記錄開始時間
        long startTime = System.currentTimeMillis();

        // 執(zhí)行 SQL
        Object result = invocation.proceed();

        // 計算執(zhí)行時間
        long endTime = System.currentTimeMillis();
        long executionTime = endTime - startTime;

        // 記錄 SQL 語句和執(zhí)行時間
        logger.info("SQL: " + sql);
        logger.info("Execution time: " + executionTime + " ms");

        return result;
    }

    @Override
    public Object plugin(Object target) {
        return Plugin.wrap(target, this);
    }

    @Override
    public void setProperties(Properties properties) {
        // 可以通過配置文件傳遞參數(shù)到攔截器
    }
}

  • 注入Bean
@Configuration
public class MyBatisConfig {
    @Bean
    public SqlExecutionInterceptor sqlExecutionInterceptor() {
        return new SqlExecutionInterceptor();
    }
}

備注:可以結(jié)合logback等配置將日志打印到單獨(dú)的日志文件中。

二、使用 Druid進(jìn)行監(jiān)控

2.1 Druid

  • 添加依賴:
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.8</version> <!-- 使用最新的版本號 -->
</dependency>
  • 配置Druid數(shù)據(jù)源
spring:
  datasource:
    druid:
      url: jdbc:mysql://localhost:3306/your_database
      username: your_username
      password: your_password
      driver-class-name: com.mysql.cj.jdbc.Driver
      # 啟用Druid監(jiān)控功能
      filters: stat
      # 配置慢SQL記錄
      maxActive: 20
      initialSize: 1
      minIdle: 1
      maxWait: 60000
      # 設(shè)置慢查詢閾值,單位為毫秒
      slowSqlMillis: 2000
      logSlowSql: true
  • 啟用Druid監(jiān)控Servlet和Filter
import com.alibaba.druid.support.http.WebStatFilter;
import com.alibaba.druid.support.http.StatViewServlet;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.boot.web.servlet.ServletRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

@Configuration
public class DruidConfig {

    // 注冊Druid的監(jiān)控Servlet
    @Bean
    public ServletRegistrationBean<StatViewServlet> druidServlet() {
        ServletRegistrationBean<StatViewServlet> servletRegistrationBean = 
                new ServletRegistrationBean<>(new StatViewServlet(), "/druid/*");
        // 設(shè)置登錄的用戶名和密碼
        servletRegistrationBean.addInitParameter("loginUsername", "admin");
        servletRegistrationBean.addInitParameter("loginPassword", "admin123");
        return servletRegistrationBean;
    }

    // 注冊Druid的監(jiān)控過濾器
    @Bean
    public FilterRegistrationBean<WebStatFilter> filterRegistrationBean() {
        FilterRegistrationBean<WebStatFilter> filterRegistrationBean = 
                new FilterRegistrationBean<>(new WebStatFilter());
        // 設(shè)置過濾的URL模式
        filterRegistrationBean.addUrlPatterns("/*");
        // 忽略的資源
        filterRegistrationBean.addInitParameter("exclusions", "*.js,*.css,/druid/*");
        return filterRegistrationBean;
    }
}
  • 訪問Druid監(jiān)控頁面:啟動應(yīng)用后,可以在瀏覽器訪問 http://localhost:8080/druid(默認(rèn)端口為8080),登錄后查看SQL執(zhí)行情況、慢SQL等詳細(xì)信息。

2.2 druid-spring-boot-starter

就像 Spring Boot 和 Spring,阿里提供了 druid-spring-boot-starter 可以更加方便的基于配置啟用相關(guān) Filter。

  • 添加依賴:
 <dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid-spring-boot-starter</artifactId>
    <version>1.2.8</version>
</dependency>

  • 配置數(shù)據(jù)源和監(jiān)控信息
########### 監(jiān)控配置
# 是否啟用StatFilter,默認(rèn)值為false
spring.datasource.druid.web-stat-filter.enabled=true
# 設(shè)置監(jiān)控攔截的url pattern,如果不配置默認(rèn)所有請求都被攔截
spring.datasource.druid.web-stat-filter.url-pattern=/*
# 設(shè)置不攔截的url,多個用英文逗號分隔
spring.datasource.druid.web-stat-filter.exclusions=/druid/*
# 是否開啟Session統(tǒng)計功能,默認(rèn)值為true
spring.datasource.druid.web-stat-filter.session-stat-enable=true
# 設(shè)置Session統(tǒng)計的最大數(shù)量,-1表示不限制,默認(rèn)值為1000
spring.datasource.druid.web-stat-filter.session-stat-max-count=1000
# 設(shè)置Session統(tǒng)計的Principal名稱,默認(rèn)值為“sessionStat”
spring.datasource.druid.web-stat-filter.principal-session-name=sessionStat
# 設(shè)置保存Session ID的cookie名稱,默認(rèn)值為“sessionStatMaxCount”
spring.datasource.druid.web-stat-filter.principal-cookie-name=sessionStatMaxCount
# 是否開啟profile,如果開啟,需要配置druid監(jiān)控的filter:profile
spring.datasource.druid.web-stat-filter.profile-enable=true

######### StatViewServlet配置
# 是否啟用StatViewServlet,默認(rèn)值為false(考慮到安全問題默認(rèn)并未啟動,如需啟用建議設(shè)置密碼或白名單以保障安全)
spring.datasource.druid.stat-view-servlet.enabled=true
# 設(shè)置監(jiān)控頁面的訪問路徑,默認(rèn)為/druid/*
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
# 是否允許重置監(jiān)控數(shù)據(jù),默認(rèn)值為true
spring.datasource.druid.stat-view-servlet.reset-enable=true
# 設(shè)置監(jiān)控頁面的登錄用戶名,默認(rèn)為空(如果設(shè)置了登錄用戶名和密碼,訪問監(jiān)控頁面時會彈出登錄框)
spring.datasource.druid.stat-view-servlet.login-username=admin
# 設(shè)置監(jiān)控頁面的登錄密碼,默認(rèn)為空(如果設(shè)置了登錄用戶名和密碼,訪問監(jiān)控頁面時會彈出登錄框)
spring.datasource.druid.stat-view-servlet.login-password=123456
# 設(shè)置允許訪問監(jiān)控頁面的IP地址列表,多個IP地址之間用英文逗號分隔,默認(rèn)為空(如果設(shè)置了白名單,只有在白名單內(nèi)的IP地址才能訪問監(jiān)控頁面)
spring.datasource.druid.stat-view-servlet.allow=127.0.0.1,192.168.1.1
# 設(shè)置禁止訪問監(jiān)控頁面的IP地址列表,多個IP地址之間用英文逗號分隔,默認(rèn)為空(如果設(shè)置了黑名單,黑名單內(nèi)的IP地址不能訪問監(jiān)控頁面)
spring.datasource.druid.stat-view-servlet.deny=192.168.1.2

#### 慢sql
# 開啟 Druid 監(jiān)控過濾器
spring.datasource.druid.filter.stat.enabled=true
# 是否記錄慢 SQL 查詢
spring.datasource.druid.filter.stat.log-slow-sql=true
# 數(shù)據(jù)庫類型,這里是 MySQL
spring.datasource.druid.filter.stat.db-type=mysql
# 定義慢 SQL 查詢的閾值,單位為毫秒
spring.datasource.druid.filter.stat.slow-sql-millis=1000
  • 日志配置
 <!--   慢sql   -->
    <appender name="slowSqlLog" class="ch.qos.logback.core.rolling.RollingFileAppender">
        <File>${log.path}/slow_sql-${log.env}.log</File>
        <!--滾動策略,按照時間滾動 TimeBasedRollingPolicy-->
        <rollingPolicy class="ch.qos.logback.core.rolling.SizeAndTimeBasedRollingPolicy">
            <!--文件路徑,定義了日志的切分方式——把每一天的日志歸檔到一個文件中,以防止日志填滿整個磁盤空間-->
            <FileNamePattern>${log.path}/arch/slow_sql/slow_sql.%d{yyyy-MM-dd}.%i.log.gz</FileNamePattern>
            <!-- 單個日志文件最多 100MB -->
            <maxFileSize>100MB</maxFileSize>
            <!--只保留最近10天的日志-->
            <maxHistory>10</maxHistory>
            <!--用來指定日志文件的上限大小,那么到了這個值,就會刪除舊的日志-->
            <totalSizeCap>1GB</totalSizeCap>
        </rollingPolicy>
        <!--日志輸出編碼格式化-->
        <encoder>
            <charset>UTF-8</charset>
            <pattern>[%d{yyyy-MM-dd HH:mm:ss}|%mdc{traceId}|] - %msg%n</pattern>
        </encoder>
    </appender>

    <logger name="com.alibaba.druid.filter.stat.StatFilter" level="info" additivity="false">
        <appender-ref ref="slowSqlLog"/>
    </logger>

以上就是Mybatis統(tǒng)計sql運(yùn)行時間的兩種方式的詳細(xì)內(nèi)容,更多關(guān)于Mybatis統(tǒng)計sql運(yùn)行時間的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • IDEA反編譯jar,查看源碼方式

    IDEA反編譯jar,查看源碼方式

    該篇文章總結(jié)了查看Java本地jar包注釋的幾種方法,包括使用快捷鍵CTRL+q和在設(shè)置中設(shè)置自動浮現(xiàn)注釋
    2024-11-11
  • Spring?Boot?項目中?JPA?語法的基本使用方法

    Spring?Boot?項目中?JPA?語法的基本使用方法

    這篇文章主要介紹了?Spring?Boot?項目中?JPA?語法的基本使用方法,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2023-10-10
  • Shrio框架實(shí)現(xiàn)自定義密碼校驗(yàn)規(guī)則詳解

    Shrio框架實(shí)現(xiàn)自定義密碼校驗(yàn)規(guī)則詳解

    文章主要介紹了Shiro框架的密碼校驗(yàn)機(jī)制,包括內(nèi)置的校驗(yàn)規(guī)則和自定義校驗(yàn)規(guī)則的實(shí)現(xiàn),在Shiro中,密碼校驗(yàn)主要通過自定義Realm來實(shí)現(xiàn),具體步驟包括定義用戶認(rèn)證信息和權(quán)限信息,并在CredentialsMatcher中實(shí)現(xiàn)用戶信息校驗(yàn)對比
    2026-03-03
  • java實(shí)現(xiàn)水仙花數(shù)的計算

    java實(shí)現(xiàn)水仙花數(shù)的計算

    這篇文章主要為大家詳細(xì)介紹了java實(shí)現(xiàn)水仙花數(shù)的計算,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-08-08
  • java中@SuppressWarnings注解用法詳解

    java中@SuppressWarnings注解用法詳解

    這篇文章主要介紹了java中@SuppressWarnings注解用法詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-02-02
  • java中日期格式化的大坑

    java中日期格式化的大坑

    這篇文章主要介紹了java中日期格式化的大坑,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-01-01
  • springmvc?html資源請求404的問題解決并分析

    springmvc?html資源請求404的問題解決并分析

    這篇文章主要介紹了springmvc?html資源請求404的問題解決并分析,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2023-09-09
  • Java實(shí)現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲)

    Java實(shí)現(xiàn)爬蟲給App提供數(shù)據(jù)(Jsoup 網(wǎng)絡(luò)爬蟲)

    這篇文章主要介紹了Java實(shí)現(xiàn)爬蟲給App提供數(shù)據(jù),即Jsoup 網(wǎng)絡(luò)爬蟲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-01-01
  • Spring的三級緩存解決循環(huán)依賴問題

    Spring的三級緩存解決循環(huán)依賴問題

    這篇文章主要介紹了Spring的三級緩存解決循環(huán)依賴問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2025-06-06
  • Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    Spring?AOP注解配置與XML配置雙實(shí)戰(zhàn)教程

    本文詳細(xì)介紹了面向切面編程(AOP)的概念、快速入門、核心概念、切點(diǎn)確定、通知分類、獲取被增強(qiáng)方法相關(guān)信息、應(yīng)用案例、XML配置、多切面順序問題以及AOP原理中的動態(tài)代理,通過實(shí)例展示了如何在Spring框架中使用AOP進(jìn)行方法增強(qiáng),感興趣的朋跟隨小編一起看看吧
    2025-11-11

最新評論

蒙山县| 肥东县| 即墨市| 高碑店市| 察隅县| 西丰县| 甘泉县| 贵阳市| 兴文县| 周口市| 临桂县| 济阳县| 泊头市| 清流县| 临澧县| 遂昌县| 仁布县| 沛县| 绿春县| 桦川县| 麻江县| 黎川县| 康定县| 石门县| 伊春市| 东兴市| 兖州市| 二连浩特市| 黔江区| 奉贤区| 巍山| 天镇县| 林口县| 黄山市| 新野县| 西乌珠穆沁旗| 溆浦县| 阆中市| 郸城县| 多伦县| 清水县|