一、前言
昨天我们完成了 SSM+MyBatis-Plus 后端框架的初始化,今天聚焦数据库交互的 “性能优化核心”——Druid 连接池配置。
Druid 是阿里巴巴开源的数据库连接池,相比 SSM 默认的连接池(如 DBCP),它不仅能实现 “连接复用”(避免每次查询都新建数据库连接,减少资源消耗),还自带 SQL 监控、慢查询统计 等实用功能,能帮我们实时排查宠物数据查询、订单提交等业务的性能问题。
今天我们会通过修改 Spring 配置文件,将默认连接池替换为 Druid,并测试监控页面是否能正常查看 SQL 执行情况,为后续高频业务(如宠物列表分页、商家服务查询)打下高效基础。
二、今日教学目标
- 理解 Druid 连接池的核心作用(连接复用 + 监控),能区分它与默认连接池的差异;
- 掌握在 SSM 项目中配置 Druid 的关键步骤(修改 spring-mybatis.xml、关联配置文件);
- 成功访问 Druid 监控页面,能通过监控查看 SQL 执行记录。
三、前置准备
- 已完成 Day2 内容:后端项目能正常启动,UserDao 的 selectById() 方法可正常查询数据;
- 简单理解 “连接池” 概念:把数据库连接比作 “水池里的水”,连接池提前创建好一批连接,业务需要时直接 “取水”,用完后 “还回水池”,避免反复 “烧水(新建连接)” 的耗时;
- 项目关键文件路径参考:
-
- Spring 配置文件:C:\Users\Downloads\my-pet-custom\mypet\src\main\resources\spring\spring-mybatis.xml
-
- 数据库配置文件:src/main/resources/config.properties
四、代码实现(核心步骤)
1. 第一步:确认 Druid 依赖(已在 pom.xml 中配置)
首先检查项目是否已引入 Druid 依赖,打开 pom.xml 文件,确认存在以下配置(项目默认已配置,无需手动添加):
<!-- Druid 连接池依赖 -->
<properties>
<druid.version>1.1.0</druid.version> <!-- 项目适配的 Druid 版本 -->
</properties>
<dependencies>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid</artifactId>
<version>${druid.version}</version>
</dependency>
</dependencies>
说明:若依赖缺失,右键 pom.xml → Maven → Reload Project,IDEA 会自动下载。
2. 第二步:修改 spring-mybatis.xml,配置 Druid 数据源
打开 spring-mybatis.xml(路径见前置准备),找到 “数据源配置” 部分,将默认的 DataSource 替换为 Druid 数据源,核心代码如下:
(1)配置 Druid 数据源(替换默认连接池)
<!-- 原有默认数据源(可注释或删除) -->
<!-- <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">...</bean> -->
<!-- 新配置:Druid 数据源 -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<!-- 1. 数据库驱动类(从 config.properties 读取配置,避免硬编码) -->
<property name="driverClassName" value="${jdbc.driver}" />
<!-- 2. 数据库连接 URL(格式:jdbc:mysql://IP:端口/数据库名?参数) -->
<property name="url" value="${jdbc.url}" />
<!-- 3. 数据库用户名 -->
<property name="username" value="${jdbc.username}" />
<!-- 4. 数据库密码 -->
<property name="password" value="${jdbc.password}" />
<!-- 可选:Druid 性能优化配置(按需添加) -->
<property name="initialSize" value="5" /> <!-- 初始化连接数 -->
<property name="minIdle" value="5" /> <!-- 最小空闲连接数 -->
<property name="maxActive" value="20" /> <!-- 最大活跃连接数 -->
<property name="maxWait" value="60000" /> <!-- 获取连接的最大等待时间(毫秒) -->
</bean>
(2)关联 config.properties 配置文件
Druid 数据源中的 {jdbc.url} 等变量,需要在 config.properties 中定义,打开该文件(路径:src/main/resources/config.properties),确认配置正确:
# 数据库驱动(MySQL 8 需用 com.mysql.cj.jdbc.Driver,MySQL 5 用 com.mysql.jdbc.Driver)
jdbc.driver=com.mysql.jdbc.Driver
# 数据库连接 URL(mypet 是项目数据库名,需与 Day1 初始化的数据库名一致)
jdbc.url=jdbc:mysql://localhost:3306/mypet?useUnicode=true&characterEncoding=utf8&useSSL=false
# 数据库用户名(默认 root)
jdbc.username=root
# 数据库密码(Day1 安装 MySQL 时设置的密码,如 123456)
jdbc.password=123456
关键提醒:若使用 MySQL 8 版本,需修改 jdbc.driver 为 com.mysql.cj.jdbc.Driver,并在 URL 后加 &serverTimezone=UTC(解决时区问题),例如:
jdbc.url=jdbc:mysql://localhost:3306/mypet?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
3. 第三步:配置 Druid 监控插件(StatFilter)
在 spring-mybatis.xml 中继续添加 Druid 监控插件,用于收集 SQL 执行数据,代码如下:
<!-- Druid 监控拦截器:收集 SQL 执行信息 -->
<bean id="druidStatInterceptor" class="com.alibaba.druid.support.spring.stat.DruidStatInterceptor">
<!-- 可选:配置过滤规则(默认监控所有 SQL) -->
<property name="filters" value="stat" /> <!-- "stat" 表示开启 SQL 统计监控 -->
</bean>
<!-- 配置监控切面:指定哪些 Bean 需要被监控(这里监控所有 Service 层 Bean) -->
<bean id="druidStatAspect" class="com.alibaba.druid.support.spring.stat.DruidStatAspect">
<property name="statInterceptor" ref="druidStatInterceptor" />
<!-- 切面表达式:监控 com.service 包下所有类的所有方法 -->
<property name="pointcut" value="execution(* com.service.*.*(..))" />
</bean>
说明:pointcut 表达式可根据需求调整,比如只监控宠物相关 Service(execution(* com.service.ChongwuxinxiService.*(..)))。
五、效果验证(核心:测试 Druid 监控页面)
1. 重启后端项目
- 在 IDEA 中停止当前运行的项目(点击红色方形按钮);
- 重新点击 “启动” 按钮(绿色三角),等待项目启动(控制台无报错即成功)。
2. 访问 Druid 监控页面
打开浏览器,输入监控页面 URL:
http://localhost:8080/mypet/druid/index.html
(1)登录监控页面(若有登录配置)
若项目配置了 Druid 登录验证(默认无,如需添加可自行配置),输入用户名密码即可;若无配置,直接进入监控首页,显示如下核心菜单:
- 数据源:查看 Druid 连接池的配置(如初始化连接数、活跃连接数);
- SQL 监控:查看所有执行过的 SQL 语句、执行次数、耗时统计;
- 慢查询日志:查看执行时间超过阈值的 SQL(默认 3000 毫秒)。
3. 测试 SQL 监控功能
我们通过执行 UserDao 的 selectList() 方法,验证监控是否生效:
- 打开 Day2 编写的 MpTest.java 测试类;
- 新增 testSelectList() 方法,查询所有用户:
@Test
public void testSelectList() {
// 调用 MP 自带的 selectList(),查询所有用户(参数 null 表示无过滤条件)
List<UserEntity> userList = userDao.selectList(null);
System.out.println("所有用户数量:" + userList.size());
}
- 运行该方法,控制台输出 “所有用户数量:X”(X 为数据库中用户总数);
- 刷新 Druid 监控页面 → 点击 “SQL 监控” 菜单,能看到类似以下记录,说明监控生效:
| SQL 语句 | 执行次数 | 总耗时(毫秒) | 平均耗时(毫秒) |
|---|---|---|---|
| SELECT * FROM users | 1 | 50 | 50 |
六、常见问题与解决方案
| 问题描述 | 可能原因 | 解决方案 |
|---|---|---|
| 启动项目时,控制台报 “Failed to load driver class com.mysql.jdbc.Driver” | 1. MySQL 驱动依赖缺失;2. 驱动类名与 MySQL 版本不匹配 | 1. 检查 pom.xml 是否有 MySQL 依赖(mysql-connector-java);2. MySQL 8 改用 com.mysql.cj.jdbc.Driver |
| 访问监控页面报 “404 Not Found” | 1. Druid 依赖未下载成功;2. 项目访问路径错误(如端口不是 8080) | 1. 右键 pom.xml → Maven → Reload Project;2. 确认 URL 中的端口(8080)与 IDEA 启动日志中的端口一致(查看控制台 “Tomcat started on port (s): XXXX”) |
| 监控页面 “SQL 监控” 为空,无任何记录 | 1. Druid 监控插件(StatFilter)未配置;2. 未执行任何 SQL 方法 | 1. 检查 spring-mybatis.xml 中是否配置了 druidStatInterceptor 和 druidStatAspect;2. 重新运行 testSelectList() 方法,执行 SQL 后刷新监控页 |
| 连接数据库报 “Access denied for user 'root'@'localhost' (using password: YES)” | 数据库用户名或密码错误 | 1. 检查 config.properties 中 jdbc.username(默认 root)和 jdbc.password 是否正确;2. 用 MySQL 命令行(mysql -uroot -p)验证密码是否能登录 |
七、工具类 / 框架特性拓展
Druid 对比其他连接池:核心优势在哪里?
| 连接池类型 | 核心特点 | 适用场景 |
|---|---|---|
| Druid(阿里) | 1. 自带 SQL 监控、慢查询统计;2. 支持防 SQL 注入;3. 可配置化程度高 | 中大型项目(如本宠物平台,需监控高频查询(宠物列表、订单)的性能) |
| HikariCP(Spring Boot 默认) | 1. 性能极致(启动快、内存占用低);2. 配置简单 | 轻量级项目(无需复杂监控,追求速度) |
| DBCP(SSM 默认) | 1. 稳定但功能单一;2. 无监控能力 | 小型 Demo 项目(不推荐生产环境) |
本项目后续开发 “宠物信息分页查询”“商家服务预约统计” 等高频功能时,我们会通过 Druid 监控页面排查 “慢 SQL”(如未加索引导致查询耗时过长),优化用户体验。
八、结语
今天的核心是 Druid 连接池配置和监控验证 —— 你的 Druid 监控页面能正常显示 SQL 记录吗?
如果遇到 “监控页空白”“连接数据库失败” 等问题,欢迎在评论区分享你的 config.properties 关键配置(注意打码密码)或控制台错误日志,我们一起排查;如果成功看到 SQL 监控记录,也可以晒出你的 “SQL 执行耗时”,看看谁的配置更高效!
小马绿泡泡:Niuma4G
需要源码的同学可私小马~
下期预告
Day4:Uni-App 前端初始化(创建跨端项目、配置底部 TabBar(首页 / 宠物 / 商家 / 我的)、实现第一个页面布局,开启前端开发流程)。