SpringBoot统计、监控SQL运行情况的方法详解

关于SpringBoot统计、监控SQL运行情况的方法,可以采用以下两种方式实现:

1. 使用Druid Spring Boot Starter

Druid Spring Boot Starter是阿里巴巴为了简化Druid在Spring Boot中的配置而推出的开箱即用的库。它基于Druid DataSource和Spring Boot自动配置机制,并提供大量属性配置供用户个性化定制。使用这种方法可以方便地监控SQL运行情况,具体步骤如下:

  1. 在Spring Boot中添加Druid Spring Boot Starter依赖
    ```


com.alibaba
druid-spring-boot-starter
${druid.version}

2. 在application.properties/application.yaml文件中进行属性配置
# 配置数据源基本属性
spring.datasource.url=jdbc:mysql://localhost:3306/test
spring.datasource.username=root
spring.datasource.password=

# 配置Druid监控器
spring.datasource.druid.initial-size=1
spring.datasource.druid.min-idle=1
spring.datasource.druid.max-active=20
spring.datasource.druid.filters=stat,wall,slf4j

# 配置Druid统计监控Servlet
spring.datasource.druid.stat-view-servlet.enabled=true
spring.datasource.druid.stat-view-servlet.url-pattern=/druid/*
spring.datasource.druid.stat-view-servlet.login-username=admin
spring.datasource.druid.stat-view-servlet.login-password=admin
```

通过访问http://localhost:8080/druid/stat/sql.html即可查看SQL运行情况的监控信息

2. 自定义拦截器实现SQL统计与监控

除了使用Druid Spring Boot Starter之外,我们还可以通过自定义拦截器实现SQL统计与监控。以MySQL为例,具体步骤如下:

  1. 在application.properties/application.yaml文件中配置数据源参数
    # 配置数据源基本属性
    spring.datasource.url=jdbc:mysql://localhost:3306/test
    spring.datasource.username=root
    spring.datasource.password=
    spring.datasource.driver-class-name=com.mysql.jdbc.Driver
  2. 自定义拦截器实现SQL统计与监控
    ```java
    public class SQLInterceptor implements HandlerInterceptor {

    // 统计SQL执行总耗时
    private ThreadLocal totalTime = new ThreadLocal<>();
    // 统计SQL执行次数
    private ThreadLocal count = new ThreadLocal<>();

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    totalTime.set(System.currentTimeMillis());
    count.set(0L);
    return true;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
    long time = System.currentTimeMillis() - totalTime.get();
    long sqlCount = count.get();
    String sql = SQLContextHolder.getCurrentSQL();
    // 输出SQL信息
    System.out.println("[SQL Monitor] Executed SQL: " + sql + ", Time: " + time + ", Count: " + sqlCount);
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
    // 统计SQL执行次数
    long sqlCount = count.get();
    count.set(sqlCount + 1);
    }

}
3. 在拦截器中获取SQL语句,存储到ThreadLocal中java
public class SQLContextHolder {

  private static ThreadLocal<String> currentSQL = new ThreadLocal<>();

  public static String getCurrentSQL() {
     return currentSQL.get();
  }

  public static void setCurrentSQL(String sql) {
     currentSQL.set(sql);
  }

  public static void clear() {
     currentSQL.set(null);
  }

}
4. 注册拦截器java
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
     registry.addInterceptor(new SQLInterceptor());
  }

}
```

这样,每次执行SQL语句时,就能在控制台输出SQL执行信息。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:SpringBoot统计、监控SQL运行情况的方法详解 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • Java编程中的一些常见问题汇总

    Java编程中的一些常见问题汇总 在Java程序开发中,我们经常会遇到一些常见问题,这些问题可能会导致程序出现异常,影响程序的正常运行。下面是一些Java编程中的常见问题汇总及其解决方案。 1. 空指针异常 空指针异常是Java程序中经常遇到的异常之一,它表示引用类型的变量未初始化或者为null,而在操作该变量时对其进行了访问,从而导致程序运行出错。 解决方…

    Java 2023年5月19日
    00
  • SpringBoot中打war包需要注意事项

    SpringBoot中打war包需要注意的事项 SpringBoot默认情况下是以jar包形式运行的,如果需要将SpringBoot项目部署到Web容器中,就需要将项目打成war包。下面是几个需要注意的事项: (1)修改项目的打包方式 在pom.xml文件中,将项目打包方式设置为war,并且去掉spring-boot-starter-web依赖的scope,…

    Java 2023年5月20日
    00
  • jsp中获取当前目录的方法

    首先,要获取当前目录的绝对路径,可以使用request.getServletContext().getRealPath(“/”)方法。 具体实现步骤如下: 1.在JSP页面中嵌入Java代码块,使用request.getServletContext().getRealPath(“/”)获取当前目录的绝对路径。 <%@ page language=&qu…

    Java 2023年5月20日
    00
  • 一文告诉你如何解决Tomcat乱码问题(很详细!)

    下面是详细讲解“一文告诉你如何解决Tomcat乱码问题(很详细!)”的完整攻略。 什么是Tomcat乱码问题? 在Java Web开发中,通常会使用Tomcat作为Web服务器。但是,在处理中文字符时,有时候会出现乱码问题(例如,读取数据库中的中文数据时显示乱码),这就是Tomcat乱码问题。 如何解决Tomcat乱码问题? 以下是解决Tomcat乱码问题的…

    Java 2023年5月19日
    00
  • Java中的局部内部类是什么?

    Java中的局部内部类是一个定义在方法或作用域内部的类,它只能在它所在的方法或作用域内使用,并且不能声明为public、protected和private等访问修饰符。局部内部类与成员内部类不同,它是嵌套在方法中的内部类,因此它只能访问它所在的方法中的final局部变量,而不能访问非final的局部变量。 下面我们来看两个实例来更具体的理解局部内部类: 示例…

    Java 2023年4月27日
    00
  • Android开发中的文件操作工具类FileUtil完整实例

    下面我会详细讲解“Android开发中的文件操作工具类FileUtil完整实例”的攻略,包含以下几个方面的内容: 简介 文件读取 文件写入 文件复制 文件删除 示例说明 结论 1. 简介 在Android开发中,文件操作时常遇到,因此可以写一个工具类封装常用的文件操作,方便进行文件操作。 2. 文件读取 使用FileInputStream对象打开文件,然后使…

    Java 2023年6月15日
    00
  • jstack+jdb命令查看线程及死锁堆栈信息的实例

    欢迎阅读本文,以下是使用jstack和jdb命令查看线程及死锁堆栈信息的实例攻略。 1.什么是jstack和jdb jstack是Java开发工具包(JDK)中的一个命令行工具,可以用于在运行时查看Java虚拟机中各个线程的状态、堆栈信息以及死锁等信息。 jdb也是JDK中的一个命令行工具,是Java Debugger的缩写,可以在运行时通过命令行调试Jav…

    Java 2023年5月26日
    00
  • java 两阶段终止线程的正确做法

    Java中线程的终止一直是个比较重要的话题,如果终止线程不当,可能会导致内存泄漏、死循环等问题。本文将详细介绍Java中两阶段终止线程的正确做法,并且提供两个示例进行说明。 什么是两阶段终止模式 两阶段终止模式是指在终止线程时采用两个阶段的方式进行终止,第一阶段发送一个中断信号以告诉线程需要终止,第二阶段等待线程终止。 两阶段终止模式的主要原理是,在第一阶段…

    Java 2023年5月19日
    00
合作推广
合作推广
分享本页
返回顶部