美文网首页alreadyDruiddruid 源码之旅
[druid 源码解析]1基础环境搭建

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

作者: AndyWei123 | 来源:发表于2021-11-08 00:13 被阅读0次

    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

    相关文章

      网友评论

        本文标题:[druid 源码解析]1基础环境搭建

        本文链接:https://www.haomeiwen.com/subject/lewyzltx.html