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-starter
、spring-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
对其进行压测:
然后我们打开如下链接: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
网友评论