Druid 怎么使用它的数据源监控?

在做分布式时,分布式大家都知道,数据库和业务层跟Controller 层是分离的,不在同一台机子。

问题:

  1. 怎么使用 Druid 达到数据源监控的目的,目前我在 Controller 层开启监控,只能监控到 url ,但无法监控 sql 执行,怎么解决?

img

img

  1. 我在 业务层使用 Druid 配置,全部失效,都无法监控到,难道 Druid 是通过监控 MyBatis 注解来实现的吗,在逻辑层做的监控,而不是在数据库上进行监控的吗?

img

img

可以看一下我的回答,其中部分参考自ChatGPT:
针对你的问题1的解答:

  1. 在数据库层使用Druid的Filter功能,将SQL语句拦截下来,并用StatFilter来记录SQL执行的时间,慢查询,执行次数等信息。

  2. 在业务层使用Druid的DataSourceProxy,可以拦截Connection对象的操作,记录每个链接的创建时间,销毁时间,以及使用时长等信息。

  3. 在Controller层使用Druid的WebStatFilter,监控url的访问情况,以及访问时长,页面访问的次数等信息。

通过上述方案,可以有效的实现Druid对分布式环境的数据源监控,从而更好的分析系统的运行状况,提高系统的性能。


针对你的问题2解答:不是在数据库上进行监控的,Druid 可以监控你在业务层使用的数据库操作。它提供了一个高效的 JDBC 监控和管理功能,其中包括用户名、IP、SQL 语句、时间、执行时间等统计信息。它使用一个内置的数据库进行监控,可以通过 SQL 语句进行监控,而不是通过 MyBatis 注解来实现的。

该回答引用GPTᴼᴾᴱᴺᴬᴵ
Druid是一个数据库连接池和监控平台,它提供了连接池的功能,可以实现高效、安全地管理连接,同时也提供了监控和统计功能,可以监控数据库连接池的状态、执行的SQL语句、响应时间等信息。

要使用Druid的数据源监控功能,需要进行如下配置:

1.引入Druid依赖

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.1.12</version>
</dependency>

2.配置Druid数据源

# 数据库连接配置
spring.datasource.url=jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8&autoReconnect=true&failOverReadOnly=false
spring.datasource.username=root
spring.datasource.password=root
spring.datasource.driver-class-name=com.mysql.jdbc.Driver

# 数据源配置
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.druid.initial-size=5
spring.datasource.druid.min-idle=5
spring.datasource.druid.max-active=20
spring.datasource.druid.max-wait=60000
spring.datasource.druid.time-between-eviction-runs-millis=60000
spring.datasource.druid.min-evictable-idle-time-millis=300000
spring.datasource.druid.validation-query=SELECT 1 FROM DUAL
spring.datasource.druid.test-while-idle=true
spring.datasource.druid.test-on-borrow=false
spring.datasource.druid.test-on-return=false
spring.datasource.druid.pool-prepared-statements=true
spring.datasource.druid.max-pool-prepared-statement-per-connection-size=20
spring.datasource.druid.filters=stat,wall,log4j
spring.datasource.druid.connection-properties=druid.stat.mergeSql=true;druid.stat.slowSqlMillis=5000
  1. 配置Druid监控平台
    ```
    @Configuration
    public class DruidConfig {

    @Value("${spring.datasource.url}")
    private String dbUrl;

    @Value("${spring.datasource.username}")
    private String username;

    @Value("${spring.datasource.password}")
    private String password;

    @Value("${spring.datasource.driver-class-name}")
    private String driverClassName;

    @Value("${spring.datasource.druid.initial-size}")
    private int initialSize;

    @Value("${spring.datasource.druid.min-idle}")
    private int minIdle;

    @Value("${spring.datasource.druid.max-active}")
    private int maxActive;

    @Value("${spring.datasource.druid.max-wait}")
    private int maxWait;

    @Value("${spring.datasource.druid.time-between-eviction-runs-millis}")
    private int timeBetweenEvictionRunsMillis;

    @Value("${spring.datasource.druid.min-evictable-idle-time-millis}")
    private int minEvictableIdleTimeMillis;

    @Value("${spring.datasource.druid.validation-query}")
    private String validationQuery;

    @Value("${spring.datasource.druid.test-while-idle}")
    private boolean testWhileIdle;

    @Value("${spring.datasource.druid.test-on-borrow}")
    private boolean testOnBorrow;

    @Value("${spring.datasource.druid.test-on-return}")
    private boolean testOnReturn;

    @Value("${spring.datasource.druid.pool-prepared-statements}")
    private boolean poolPreparedStatements;

    @Value("${spring.datasource.druid.max-pool-prepared-statement-per-connection-size}")
    private int maxPoolPreparedStatementPerConnectionSize;

```

你使用的是人家的数据源,只有有数据源并且真正执行sql的地方才能拦截到sql