婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > mybatis統計每條SQL的執行時間的方法示例

mybatis統計每條SQL的執行時間的方法示例

熱門標簽:外呼系統電銷受騙 萊西市地圖標注 安徽ai電話電銷機器人有效果嗎 在哪里申請400電話 走過哪個省地圖標注 巫師三血與酒地圖標注 銷售語音電話機器人 常州網絡外呼系統開發 400電話申請信用卡

背景

最近面試經常被問到關于數據庫的事務的問題,可能平時我就知道加個注解@Transactional之后就一臉懵逼的。現在發現這一塊真的是常常被忽略了,然而面試官就是最喜歡這種看是不常用,但是非常重要的問題,進而達到出其不意攻其不備。不吹水了,開始正文。

方案一:切面編程@Aspect

此方案主要是通過環繞切面的方式將mapper包下的接口方法,然后前后計算時間差即可。這就是典型的AOP知識,不過這種計算比較粗糙,但是也是個辦法。具體方法如下:

@Aspect
@Component
@Slf4j
public class MapperAspect {

  @AfterReturning("execution(* cn.xbmchina.mybatissqltime.mapper.*Mapper.*(..))")
  public void logServiceAccess(JoinPoint joinPoint) {
    log.info("Completed: " + joinPoint);
  }


  /**
   * 監控cn.xbmchina.mybatissqltime.mapper..*Mapper包及其子包的所有public方法
   */
  @Pointcut("execution(* cn.xbmchina.mybatissqltime.mapper.*Mapper.*(..))")
  private void pointCutMethod() {
  }

  /**
   * 聲明環繞通知
   *
   * @param pjp
   * @return
   * @throws Throwable
   */
  @Around("pointCutMethod()")
  public Object doAround(ProceedingJoinPoint pjp) throws Throwable {
    long begin = System.nanoTime();
    Object obj = pjp.proceed();
    long end = System.nanoTime();

    log.info("調用Mapper方法:{},參數:{},執行耗時:{}納秒,耗時:{}毫秒",
        pjp.getSignature().toString(), Arrays.toString(pjp.getArgs()),
        (end - begin), (end - begin) / 1000000);
    return obj;
  }
}

方案二:mybatis 的插件

MyBatis在四大對象的創建過程中,都會有插件進行介入。插件可以利用動態代理機制一層層的包裝目標對象,而實現在目標對象執行目標方法之前進行攔截的效果。

MyBatis 允許在已映射語句執行過程中的某一點進行攔截調用。

默認情況下,MyBatis 允許使用插件來攔截的方法調用包括:

①Executor(update, query, flushStatements, commit, rollback, getTransaction, close, isClosed)
②ParameterHandler(getParameterObject, setParameters)
③ResultSetHandler(handleResultSets, handleOutputParameters)
④StatementHandler(prepare, parameterize, batch, update, query)

下面是代碼:

import org.apache.ibatis.executor.statement.StatementHandler;
import org.apache.ibatis.mapping.BoundSql;
import org.apache.ibatis.mapping.ParameterMapping;
import org.apache.ibatis.plugin.Interceptor;
import org.apache.ibatis.plugin.Intercepts;
import org.apache.ibatis.plugin.Invocation;
import org.apache.ibatis.plugin.Plugin;
import org.apache.ibatis.plugin.Signature;
import org.apache.ibatis.session.ResultHandler;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

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

/**
 * Sql執行時間記錄攔截器
 *
 * @author zero
 * 2019年12月13日17:05:28
 */
@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})})
@Component
public class SqlExecuteTimeCountInterceptor implements Interceptor {

  private static Logger logger = LoggerFactory.getLogger(SqlExecuteTimeCountInterceptor.class);

  /**
   * 打印的參數字符串的最大長度
   */
  private final static int MAX_PARAM_LENGTH = 50;

  /**
   * 記錄的最大SQL長度
   */
  private final static int MAX_SQL_LENGTH = 200;


  @Override
  public Object intercept(Invocation invocation) throws Throwable {
    Object target = invocation.getTarget();
    long startTime = System.currentTimeMillis();
    StatementHandler statementHandler = (StatementHandler) target;
    try {
      return invocation.proceed();
    } finally {
      long endTime = System.currentTimeMillis();
      long timeCount = endTime - startTime;

      BoundSql boundSql = statementHandler.getBoundSql();
      String sql = boundSql.getSql();
      Object parameterObject = boundSql.getParameterObject();
      ListParameterMapping> parameterMappingList = boundSql.getParameterMappings();

      // 格式化Sql語句,去除換行符,替換參數
      sql = formatSQL(sql, parameterObject, parameterMappingList);

      logger.info("執行 SQL:[ , {} ]執行耗時[ {} ms]", sql, timeCount);
    }
  }


  /**
   * 格式化/美化 SQL語句
   *
   * @param sql         sql 語句
   * @param parameterObject   參數的Map
   * @param parameterMappingList 參數的List
   * @return 格式化之后的SQL
   */
  private String formatSQL(String sql, Object parameterObject, ListParameterMapping> parameterMappingList) {
    // 輸入sql字符串空判斷
    if (sql == null || sql.length() == 0) {
      return "";
    }
    // 美化sql
    sql = beautifySql(sql);
    // 不傳參數的場景,直接把sql美化一下返回出去
    if (parameterObject == null || parameterMappingList == null || parameterMappingList.size() == 0) {
      return sql;
    }
    return LimitSQLLength(sql);
  }


  /**
   * 返回限制長度之后的SQL語句
   *
   *
   * @param sql 原始SQL語句
   */
  private String LimitSQLLength(String sql) {
    if (sql == null || sql.length() == 0) {
      return "";
    }
    if (sql.length() > MAX_SQL_LENGTH) {
      return sql.substring(0, MAX_SQL_LENGTH);
    } else {
      return sql;
    }
  }


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

  @Override
  public void setProperties(Properties properties) {

  }




  /**
   * 替換SQL 中? 所對應的值, 只保留前50個字符
   *
   * @param sql   sql語句
   * @param valueOf ?對應的值
   */
  private String replaceValue(String sql, String valueOf) {
    //超過50個字符只取前50個
    if (valueOf != null  valueOf.length() > MAX_PARAM_LENGTH) {
      valueOf = valueOf.substring(0, MAX_PARAM_LENGTH);
    }
    sql = sql.replaceFirst("\\?", valueOf);
    return sql;
  }

  /**
   * 美化sql
   *
   * @param sql sql語句
   */
  private String beautifySql(String sql) {
    sql = sql.replaceAll("[\\s\n ]+", " ");
    return sql;
  }
 }

方案三:直接用druid

這種就是我們平時用的最多的,但是面試的話說一下就得了,估計也沒有怎么好問的了。

Springboot+druid的配置application.yml文件如下:

spring:
  datasource:
    url: jdbc:mysql://localhost:3306/testdb1?characterEncoding=utf-8useUnicode=trueuseSSL=falseserverTimezone=UTC
    driver-class-name: com.mysql.jdbc.Driver # mysql8.0以前使用com.mysql.jdbc.Driver
    username: root
    password: root
    platform: mysql
    #通過這句配置將druid連接池引入到我們的配置中,spring會盡可能判斷類型是什么,然后根據情況去匹配驅動類。
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      initial-size: 5 # 初始化大小
      min-idle: 5 # 最小
      max-active: 100 # 最大
      max-wait: 60000 # 配置獲取連接等待超時的時間
      time-between-eviction-runs-millis: 60000 # 配置間隔多久才進行一次檢測,檢測需要關閉的空閑連接,單位是毫秒
      min-evictable-idle-time-millis: 300000 # 指定一個空閑連接最少空閑多久后可被清除,單位是毫秒
      validationQuery: select 'x'
      test-while-idle: true # 當連接空閑時,是否執行連接測試
      test-on-borrow: false # 當從連接池借用連接時,是否測試該連接
      test-on-return: false # 在連接歸還到連接池時是否測試該連接
      filters: config,wall,stat # 配置監控統計攔截的filters,去掉后監控界面sql無法統計,'wall'用于防火墻
      poolPreparedStatements: true # 打開PSCache,并且指定每個連接上PSCache的大小
      maxPoolPreparedStatementPerConnectionSize: 20
      maxOpenPreparedStatements: 20
      # 通過connectProperties屬性來打開mergeSql功能;慢SQL記錄
      connectionProperties: druid.stat.slowSqlMillis=200;druid.stat.logSlowSql=true;config.decrypt=false
       # 合并多個DruidDataSource的監控數據
      #use-global-data-source-stat: true
      #WebStatFilter配置,說明請參考Druid Wiki,配置_配置WebStatFilter
      web-stat-filter:
        enabled: true #是否啟用StatFilter默認值true
        url-pattern: /*
        exclusions: /druid/*,*.js,*.gif,*.jpg,*.bmp,*.png,*.css,*.ico
        session-stat-enable: true
        session-stat-max-count: 10
      #StatViewServlet配置,說明請參考Druid Wiki,配置_StatViewServlet配置
      stat-view-servlet:
        enabled: true #是否啟用StatViewServlet默認值true
        url-pattern: /druid/*
        reset-enable: true
        login-username: admin
        login-password: admin

總結

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

您可能感興趣的文章:
  • mybatis 插件: 打印 sql 及其執行時間實現方法
  • java利用mybatis攔截器統計sql執行時間示例

標簽:赤峰 河北 陽江 黃石 果洛 來賓 煙臺 鞍山

巨人網絡通訊聲明:本文標題《mybatis統計每條SQL的執行時間的方法示例》,本文關鍵詞  mybatis,統計,每條,SQL,的,;如發現本文內容存在版權問題,煩請提供相關信息告之我們,我們將及時溝通與處理。本站內容系統采集于網絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《mybatis統計每條SQL的執行時間的方法示例》相關的同類信息!
  • 本頁收集關于mybatis統計每條SQL的執行時間的方法示例的相關信息資訊供網民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    男女性色大片免费观看一区二区 | 欧美一区二区视频网站| 欧美精品777| 自拍偷拍国产亚洲| 色综合久久六月婷婷中文字幕| 日韩无一区二区| 亚洲国产精品天堂| heyzo一本久久综合| 一区二区理论电影在线观看| 国产精品白丝jk黑袜喷水| 成人动漫视频在线| 久久亚洲精品国产精品紫薇| 麻豆精品视频在线| 日韩一区二区在线看| 国产精品夜夜嗨| 精品黑人一区二区三区久久| 国产精品一区二区久久精品爱涩| 7777女厕盗摄久久久| 亚洲地区一二三色| xf在线a精品一区二区视频网站| 免费精品视频最新在线| 久久婷婷久久一区二区三区| 国产自产视频一区二区三区| 欧美精品一区二区三区在线播放| jiyouzz国产精品久久| 专区另类欧美日韩| 日韩欧美的一区二区| 久久精品999| 欧美美女激情18p| 成人av资源网站| 亚洲综合偷拍欧美一区色| 久久婷婷成人综合色| 成人美女视频在线观看18| 偷窥少妇高潮呻吟av久久免费| 4438x成人网最大色成网站| 免费av网站大全久久| 亚洲视频一区在线| 欧美午夜视频网站| 成人精品一区二区三区四区 | 日韩—二三区免费观看av| 国产视频亚洲色图| 99re这里只有精品首页| 国产激情一区二区三区桃花岛亚洲| 久久精品一区蜜桃臀影院| 精品伊人久久久久7777人| 亚洲成人av一区二区三区| 日韩三级中文字幕| 欧美日韩一区二区在线观看| 激情综合网av| 美日韩一级片在线观看| 亚洲色图视频网站| 在线影院国内精品| 色综合天天天天做夜夜夜夜做| 青青草国产精品亚洲专区无| 爽好多水快深点欧美视频| 欧美极品美女视频| 久久综合一区二区| 欧美剧情片在线观看| 国产揄拍国内精品对白| 国内精品在线播放| 亚洲第一会所有码转帖| 亚洲综合成人网| 国产亚洲福利社区一区| 久久精品欧美日韩精品| 777精品伊人久久久久大香线蕉| 成人不卡免费av| jizzjizzjizz欧美| 国产精品一级在线| 91在线观看下载| 国产成人av网站| 色综合天天在线| 成人av在线影院| 夜夜爽夜夜爽精品视频| 亚洲电影在线播放| 亚洲精品国产高清久久伦理二区| 玉足女爽爽91| 亚洲色欲色欲www| 五月激情六月综合| 日韩理论片网站| 欧美精品久久天天躁| 欧美一区二区三区在线电影| 欧美系列一区二区| 欧美大片日本大片免费观看| 欧美精品乱码久久久久久| 欧美va亚洲va| 精品88久久久久88久久久| 91久久精品一区二区| 91精品国产高清一区二区三区蜜臀 | 国产69精品久久久久777| 国产成人久久精品77777最新版本| 麻豆91在线看| www.色综合.com| 不卡av在线网| 欧美日韩在线观看一区二区| 欧美性猛交xxxx黑人交| 欧美在线你懂的| 国产亚洲成aⅴ人片在线观看 | 91在线一区二区三区| 欧美日韩国产乱码电影| 欧美日本在线播放| 久久精品视频免费观看| 国产日韩欧美a| 国产精品美女视频| 免费成人在线视频观看| 国产一区二区三区av电影| 在线免费精品视频| 91精品国产综合久久蜜臀| 1024精品合集| 亚洲va国产天堂va久久en| 懂色av一区二区三区免费观看| 99精品视频在线观看| 91在线播放网址| 成人激情免费网站| 欧美午夜寂寞影院| 国产精品卡一卡二| 亚洲成av人片在线观看| 亚洲啪啪综合av一区二区三区| 国产一区二区三区免费播放| www.66久久| 国产精品网友自拍| 亚洲国产一二三| 色悠久久久久综合欧美99| 欧美一区午夜视频在线观看| 亚洲成人免费视| 顶级嫩模精品视频在线看| 成人午夜激情影院| 国产日产欧产精品推荐色| 一区二区三区自拍| 在线观看欧美日本| 久久久久久久免费视频了| 韩国欧美国产1区| 91免费精品国自产拍在线不卡| 国产女人18毛片水真多成人如厕 | 欧美视频在线观看一区二区| 国产精品视频九色porn| 亚洲国产欧美在线| 欧美天堂亚洲电影院在线播放| 久久久亚洲精品一区二区三区| 中文字幕国产一区| www.亚洲国产| 久久久亚洲精品石原莉奈| 国产69精品久久777的优势| 7777女厕盗摄久久久| 毛片不卡一区二区| 在线一区二区三区四区五区| 亚洲一区二区影院| 成人av在线播放网站| 欧美精品黑人性xxxx| 免费亚洲电影在线| 在线综合+亚洲+欧美中文字幕| 日韩av二区在线播放| 91久久一区二区| 日本视频在线一区| 欧美一区二区三区四区高清 | 国产精品欧美精品| 色综合久久久久网| 国产精品视频九色porn| 欧美在线看片a免费观看| 亚洲桃色在线一区| 欧美一区二区视频网站| 亚洲成人免费视| 国产婷婷色一区二区三区四区 | 亚洲成人中文在线| 欧美自拍偷拍午夜视频| 日本视频在线一区| 91精品婷婷国产综合久久竹菊| 国产在线看一区| 久久久亚洲精华液精华液精华液| 成人免费视频一区| 中文字幕亚洲在| 国产精品一品二品| 亚洲国产综合色| 欧美色图一区二区三区| 国产精品亚洲午夜一区二区三区 | 亚洲一区二区三区在线看| 国产成人在线看| 亚洲成a人片在线不卡一二三区| 欧美日韩精品一区二区三区蜜桃| 国产乱码一区二区三区| 国产欧美日韩精品a在线观看| 成人国产精品免费观看视频| 亚洲欧美在线视频| 五月天欧美精品| 久久久综合视频| 日韩一区二区三区免费看| 国产激情精品久久久第一区二区| 亚洲不卡av一区二区三区| 精品剧情在线观看| 韩国女主播一区二区三区| 天堂av在线一区| 国产日韩欧美一区二区三区乱码| 欧美一区二区视频在线观看2020 | 一区二区三区欧美日韩| 91精品婷婷国产综合久久性色| 国产91在线|亚洲| 一区二区三区四区国产精品| 欧美国产日韩一二三区| 欧美图区在线视频| 欧美性xxxxxx少妇| 国产精品99久久久久久有的能看 |