Druid 是一个非常流行的数据库连接池组件,专为 Java 应用程序设计。它主要用来管理和优化与数据库的连接,并且提供了丰富的监控和统计功能。简单来说,Druid 的作用是:
- 管理数据库连接:Druid 帮助应用程序高效管理与数据库的连接,避免每次操作都要重新打开和关闭连接,从而提高数据库的性能。
- 性能优化:Druid 提供了许多数据库连接池的调优参数,可以根据业务场景进行配置,优化数据库连接的性能。
- 监控与统计:它内置了强大的监控功能,可以统计 SQL 执行时间、慢 SQL、数据库连接的使用情况等,这对于排查问题和优化系统非常有用。
Druid 的主要功能
- 数据库连接池管理:Druid 可以有效管理数据库连接,减少频繁创建和销毁连接带来的开销,提升性能。
- SQL 监控:内置 SQL 执行分析工具,可以分析和统计 SQL 执行时间、调用频率、慢查询等,有助于发现数据库性能问题。
- 防止 SQL 注入:Druid 提供了防止 SQL 注入攻击的功能,增加了应用的安全性。
- Web 监控界面:Druid 提供了一个简易的 Web 控制台,开发者可以在浏览器中查看数据库连接池的使用情况和 SQL 的执行情况。
Druid 和其他组件的配合
Druid 通常与以下组件配合使用:
-
Spring/Spring Boot:
- 自动配置:在 Spring/Spring Boot 项目中,Druid 可以轻松与
DataSource配置集成,自动管理数据库连接。 - 监控整合:通过 Spring Boot 的
actuator模块,可以将 Druid 的监控数据集成到 Spring Boot 的监控体系中,进行统一监控管理。
- 自动配置:在 Spring/Spring Boot 项目中,Druid 可以轻松与
-
MyBatis / Hibernate:
- 这些都是常用的 ORM(对象关系映射)框架,用于简化数据库操作。Druid 可以作为它们的数据库连接池,从而更高效地管理数据库连接。
- SQL 性能监控:结合 Druid 和 MyBatis/Hibernate,可以方便地监控 SQL 的执行性能。
-
Maven/Gradle:
- Druid 是以 Jar 包的形式引入的,所以在 Maven/Gradle 中可以很方便地添加 Druid 作为项目的依赖。
为什么选择 Druid?
- 稳定性:Druid 非常稳定,是国内外很多企业常用的数据库连接池。
- 易用性:Druid 的配置相对简单,而且集成了很多常见的数据库管理功能(如连接池监控、SQL 统计)。
- 强大的监控功能:相比其他连接池(如 HikariCP、C3P0),Druid 拥有更强大的 SQL 监控和性能统计功能,非常适合需要对数据库性能有深入分析需求的场景。
一个简单的类比
你可以把 Druid 想象成一个“饭店服务员”。数据库连接是饭店里的座位,应用程序的请求就像顾客进餐。每次顾客进来,Druid(服务员)都会帮忙安排一个座位(数据库连接),并且记录下哪些顾客点了哪些菜(SQL 执行),顾客吃完后它还会把桌子收拾好(释放连接)。如果某个顾客等得太久了或者菜(SQL)做得太慢,它还会提醒你这个菜的制作流程(SQL 执行过程)哪里出了问题。
0. 配置
| 系统 | win11 |
| springboot | 3.2.10 |
| 工具 | VsCode |
| JDK | 17 |
1. 完整的 application.yml 示例
在 src/main/resources/application.yml 文件中,使用以下内容进行配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
druid:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/TEST_ATGUIGU?useUnicode=true&characterEncoding=utf-8&serverTimezone=UTC
username: <USERNAME> # 替换为你的数据库用户名
password: <PASSWORD> # 替换为你的数据库密码
initial-size: 5
min-idle: 5
max-active: 20
max-wait: 60000
validation-query: SELECT 1
test-while-idle: true
test-on-borrow: true
test-on-return: false
druid:
stat-view-servlet:
url-pattern: /druid/*
login-username: admin
login-password: admin
allow: 127.0.0.1
deny:
web-stat-filter:
url-pattern: /*
exclusions: "*.js,*.gif,*.jpg,*.png,*.css,*.ico,/druid/*"
2. 更新数据库用户名和密码
确保你将 <USERNAME> 和 <PASSWORD> 替换为你的实际 MySQL 数据库的用户名和密码。
3. 添加 Maven 依赖
确保在 pom.xml 文件中包含 Druid 和 MySQL 的依赖:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>3.0.5</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
<groupId>com.atguigu</groupId>
<artifactId>springboot_mvc</artifactId>
<version>0.0.1-SNAPSHOT</version>
<name>springboot_mvc</name>
<description>Demo project for Spring Boot</description>
<url/>
<licenses>
<license/>
</licenses>
<developers>
<developer/>
</developers>
<scm>
<connection/>
<developerConnection/>
<tag/>
<url/>
</scm>
<properties>
<java.version>17</java.version>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-devtools</artifactId>
</dependency>
<!--swagger ui -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-ui</artifactId>
<version>2.1.0</version>
</dependency>
<!--swagger api -->
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-starter-webmvc-api</artifactId>
<version>2.1.0</version>
</dependency>
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>3.0.1</version>
</dependency>
<!-- jdbc -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-jdbc</artifactId>
</dependency>
<!-- druid -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-3-starter</artifactId>
<version>1.2.18</version>
</dependency>
<!-- mysql-connector-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>8.0.28</version>
</dependency>
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<configuration>
<excludes>
<exclude>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</exclude>
</excludes>
</configuration>
</plugin>
</plugins>
</build>
</project>
4. 创建监控 Controller(可选)
你可以创建一个简单的 Controller,以便访问 Druid 监控页面:
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
@Controller
public class DruidController {
@GetMapping("/druid")
public String druid() {
return "forward:/druid/index.html";
}
}
5. 启动应用
启动你的 Spring Boot 应用后,访问 http://localhost:8080/druid 查看 Druid 的监控界面。
6. 测试数据库连接
确保连接正常,可以创建一个简单的服务类进行测试:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.stereotype.Service;
@Service
public class TestService {
@Autowired
private JdbcTemplate jdbcTemplate;
public void testConnection() {
String sql = "SELECT COUNT(*) FROM students"; // 替换为你的表名
Integer count = jdbcTemplate.queryForObject(sql, Integer.class);
System.out.println("Count: " + count);
}
}
完成上述步骤后,你应该成功整合 Druid 数据源与 MySQL。
总结
- Druid 作用:管理数据库连接池、优化性能、监控 SQL 执行。
- 配合使用:通常与 Spring、MyBatis、Hibernate 等框架结合使用,管理和监控数据库连接。