随笔14. SpringBoot 3.2.10 Druid数据库连接池

273 阅读5分钟

Druid 是一个非常流行的数据库连接池组件,专为 Java 应用程序设计。它主要用来管理和优化与数据库的连接,并且提供了丰富的监控和统计功能。简单来说,Druid 的作用是:

  1. 管理数据库连接:Druid 帮助应用程序高效管理与数据库的连接,避免每次操作都要重新打开和关闭连接,从而提高数据库的性能。
  2. 性能优化:Druid 提供了许多数据库连接池的调优参数,可以根据业务场景进行配置,优化数据库连接的性能。
  3. 监控与统计:它内置了强大的监控功能,可以统计 SQL 执行时间、慢 SQL、数据库连接的使用情况等,这对于排查问题和优化系统非常有用。

Druid 的主要功能

  1. 数据库连接池管理:Druid 可以有效管理数据库连接,减少频繁创建和销毁连接带来的开销,提升性能。
  2. SQL 监控:内置 SQL 执行分析工具,可以分析和统计 SQL 执行时间、调用频率、慢查询等,有助于发现数据库性能问题。
  3. 防止 SQL 注入:Druid 提供了防止 SQL 注入攻击的功能,增加了应用的安全性。
  4. Web 监控界面:Druid 提供了一个简易的 Web 控制台,开发者可以在浏览器中查看数据库连接池的使用情况和 SQL 的执行情况。

Druid 和其他组件的配合

Druid 通常与以下组件配合使用:

  1. Spring/Spring Boot

    • 自动配置:在 Spring/Spring Boot 项目中,Druid 可以轻松与 DataSource 配置集成,自动管理数据库连接。
    • 监控整合:通过 Spring Boot 的 actuator 模块,可以将 Druid 的监控数据集成到 Spring Boot 的监控体系中,进行统一监控管理。
  2. MyBatis / Hibernate

    • 这些都是常用的 ORM(对象关系映射)框架,用于简化数据库操作。Druid 可以作为它们的数据库连接池,从而更高效地管理数据库连接。
    • SQL 性能监控:结合 Druid 和 MyBatis/Hibernate,可以方便地监控 SQL 的执行性能。
  3. Maven/Gradle

    • Druid 是以 Jar 包的形式引入的,所以在 Maven/Gradle 中可以很方便地添加 Druid 作为项目的依赖。

为什么选择 Druid?

  • 稳定性:Druid 非常稳定,是国内外很多企业常用的数据库连接池。
  • 易用性:Druid 的配置相对简单,而且集成了很多常见的数据库管理功能(如连接池监控、SQL 统计)。
  • 强大的监控功能:相比其他连接池(如 HikariCP、C3P0),Druid 拥有更强大的 SQL 监控和性能统计功能,非常适合需要对数据库性能有深入分析需求的场景。

一个简单的类比

你可以把 Druid 想象成一个“饭店服务员”。数据库连接是饭店里的座位,应用程序的请求就像顾客进餐。每次顾客进来,Druid(服务员)都会帮忙安排一个座位(数据库连接),并且记录下哪些顾客点了哪些菜(SQL 执行),顾客吃完后它还会把桌子收拾好(释放连接)。如果某个顾客等得太久了或者菜(SQL)做得太慢,它还会提醒你这个菜的制作流程(SQL 执行过程)哪里出了问题。

0. 配置

系统win11
springboot3.2.10
工具VsCode
JDK17

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 的监控界面。

image.png

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 等框架结合使用,管理和监控数据库连接。