alreadyDruiddruid 源码之旅

[druid 源码解析]1基础环境搭建

2021-11-08  本文已影响0人  AndyWei123

1.背景

druid目前是国内使用最广泛的数据库连接池,了解学习其源码无疑对我们的工作有很好处,这次源码学习主要是针对 druid 的核心功能 pool 进行分析,其中会附带讲解其他部分内容,好啦废话不多说,我们开始吧。

开始

2.1 下载源码

我们先到github上下载 druid 的源码,使用idea打开,我们看到主要的项目结构如下:


项目结构

其中的 pool 就是我们这次讲解的主要内容。

2.2 example项目编写

学习一个源码项目,我们有几个切入点,首先是单元测试,然后就是 example 项目,我们先从一个简单的 example 开始。

2.2.1 pom 引入

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.8</version>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.mybatis.spring.boot</groupId>
            <artifactId>mybatis-spring-boot-starter</artifactId>
            <version>2.2.0</version>
        </dependency>
    </dependencies>

可以看出来,我们除了引入 druid 外,还引入了 spring-boot-starterspring-boot-starter-web 来方便测试,引入 ORM 框架 Mybatis spring-boot-starter-mybatis 和 mysql 驱动以及测试工具。

2.2.2 配置

除了引入依赖,我们更重要的是加入配置信息

Spring:
  datasource:
    url: jdbc:mysql://localhost:3306/information_schema?useSSL=false&useUnicode=true&characterEncoding=UTF-8
    driver-class-name: com.mysql.jdbc.Driver
    username: root
    password: root
# 使用 druid 作为默认 DataSource
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
# 开启 druid 的 web 拦截功能(druid 除了是一个数据库连接池外也是一个优秀的监控工具)
      web-stat-filter:
        enabled: true
        url-pattern: /*
# 最小连接数
      min-idle: 1
# 最大连接数
      max-active: 20
      filter:
        stat:
# 开启慢sql 拦截,大于 100ms 都属于 slow sql
          log-slow-sql: true
          slow-sql-millis: 100
          enabled: true
      stat-view-servlet:
        enabled: true
        login-username: admin
        login-password: admin
server:
  port: 8080
# 定义 Mybatis 扫描路径
mybatis:
  mapper-locations: classpath:mapper/*.xml

2.2.3 启动类

最后我们定义 SpringBoot 的启动类

@SpringBootApplication
@MapperScan(basePackages = "com.andy.example")
public class DruidApplication implements CommandLineRunner {
    private Logger logger = LoggerFactory.getLogger(DruidApplication.class);

    @Autowired
    private DataSource dataSource;

    public static void main(String[] args) {
        // 启动 Spring Boot 应用
        SpringApplication.run(DruidApplication.class, args);
    }

    @Override
    public void run(String... args) {
        logger.info("[run][获得数据源:{}]", dataSource.getClass());
    }

}

我们在启动完成的时候打印一下 datasource 的信息。

2.2.4 测试类

我们这次就不新建表信息了,直接使用MySQL 默认的 information_schema schema 的 TABLES 表,(mapper 信息省略)如下:

@RestController
public class TableController {

    @Autowired
    TablesDao tablesDao;

    @GetMapping("/tables")
    public List<Tables> getAll() {
        return tablesDao.selectByExample(null);
    }
}

我们直接调用就可以得到一个 JSON 信息。

2.2.5 监控

为了更加方便我们采集监控数据,我们使用 wrk 对其进行压测:

wrk
然后我们打开如下链接:http://localhost:8080/druid
登录的用户密码是我们在上面配置文件设置的。我们先看一下 filter这里,我们可以看出来有个 stat filter,这个就是我们 slow sql 拦截的 filter
我们到 SQL 监控这栏就可以看到我们刚才压测的 sql ,我们可以看到执行的次数,最大时间,总共耗时,同事还可以点进 detail 看sql 详情:
sql 监控
同时我们开可以在 web 监控哪里看到我们设置的 web 拦截器拦截的内容,和sql 拦截类似:
web 拦截
因为我们在上面还设置了 slow sql 打印,我们可以看一下 console 可以看到如下信息:
slow sql log
上一篇下一篇

猜你喜欢

热点阅读