1. 为什么选择Druid连接MySQL数据库第一次在IDEA里配置数据库连接池时我踩了不少坑。当时项目急着上线直接用JDBC连接MySQL结果高峰期频繁报连接超时错误。后来改用Druid后系统稳定性直接提升了好几个档次。Druid作为阿里巴巴开源的数据库连接池最大的特点就是监控功能完善能实时查看连接状态这对排查线上问题特别有帮助。相比其他连接池Druid在性能上也有明显优势。实测在相同硬件环境下Druid处理高并发的响应时间比HikariCP还要快15%左右。而且它的SQL防注入功能是内置的不需要额外配置。记得有次项目被恶意注入攻击正是Druid的WallFilter自动拦截了可疑SQL避免了数据泄露。新手最头疼的配置问题Druid也考虑得很周到。它的配置项都有详细的中文文档说明遇到报错时社区响应也快。我后来带团队时发现即使是刚学Java的实习生照着文档也能在半小时内完成基础配置。下面我就把这些年总结的配置经验用最直白的方式分享给大家。2. 前期准备工作2.1 开发环境检查在开始之前先确认你的IDEA版本至少是2020.3以上。老版本对Maven支持不够完善容易出依赖冲突。打开IDEA后新建项目时记得勾选这两个选项Create Git repository方便版本控制和Add sample code会自动生成main方法。MySQL建议用8.0以上版本5.7虽然也能用但时区配置会更麻烦。安装MySQL时有个关键点一定要记牢root密码我有次给学员演示安装时随手点了下一步结果后面连不上数据库只能重装系统。安装完成后用Navicat或MySQL Workbench先测试下本地连接是否正常。2.2 必备软件安装除了IDEA和MySQL还需要准备Maven 3.6.3管理项目依赖JDK 1.8别用11有些老项目不兼容数据库可视化工具推荐DBeaver安装Maven后要配置环境变量这个很多新手会漏掉。在命令行输入mvn -v能显示版本号才算成功。有个小技巧在IDEA的Terminal里直接执行mvn help:system会自动下载所有基础依赖比手动配置快得多。3. 创建项目与依赖配置3.1 新建Maven项目打开IDEA选择File New Project左侧选Maven右侧勾选Create from archetype选择maven-archetype-quickstart。GroupId填公司域名倒写如com.exampleArtifactId写项目名建议小写字母加中划线。创建完成后先别急着写代码。在pom.xml里添加这两个基础依赖dependencies !-- MySQL驱动 -- dependency groupIdmysql/groupId artifactIdmysql-connector-java/artifactId version8.0.28/version /dependency !-- Druid连接池 -- dependency groupIdcom.alibaba/groupId artifactIddruid/artifactId version1.2.8/version /dependency /dependencies保存后IDEA会自动下载依赖。如果卡住可以右键项目选Maven Reimport。我遇到过下载到一半报错的情况通常是网络问题换个Maven镜像源就能解决。3.2 依赖冲突解决新手最容易栽在依赖冲突上。比如同时引入Spring Boot和Druid时可能会因为版本不兼容导致连接池不生效。有个万能排查命令mvn dependency:tree -Dverbose这个命令会打印完整的依赖树标红的就是冲突项。常见解决办法是在pom里用exclusions排除旧版本。比如发现有两个不同版本的log4j可以这样处理exclusions exclusion groupIdorg.slf4j/groupId artifactIdslf4j-log4j12/artifactId /exclusion /exclusions4. 核心配置文件详解4.1 druid.properties配置在resources目录下新建druid.properties文件这是Druid的核心配置文件。下面这个模板是我经过多个项目验证过的稳定配置# 基本连接配置 driverClassNamecom.mysql.cj.jdbc.Driver urljdbc:mysql://localhost:3306/your_database?useSSLfalseserverTimezoneAsia/Shanghai usernameyour_username passwordyour_password # 连接池大小 initialSize5 maxActive20 minIdle5 maxWait60000 # 监控配置 filtersstat,wall,log4j connectionPropertiesdruid.stat.mergeSqltrue;druid.stat.slowSqlMillis5000 # 定期检查 testWhileIdletrue testOnBorrowfalse testOnReturnfalse validationQuerySELECT 1 timeBetweenEvictionRunsMillis60000 minEvictableIdleTimeMillis300000重点说明几个容易出错的参数useSSLfalse本地开发环境一定要加否则会报握手错误serverTimezone必须和MySQL服务器时区一致validationQueryMySQL 8.0要用SELECT 15.7可以用SELECT 1 FROM DUAL4.2 时区问题终极解决方案我见过最多的报错就是时区异常控制台会提示The server timezone value EDT is unrecognized。终极解决方案是在url后追加参数urljdbc:mysql://localhost:3306/test?useUnicodetruecharacterEncodingUTF-8useSSLfalseserverTimezoneAsia/ShanghaizeroDateTimeBehaviorCONVERT_TO_NULLallowPublicKeyRetrievaltrue如果还不行就在MySQL客户端执行SET GLOBAL time_zone 8:00;5. Java代码实现5.1 连接池工具类创建一个DruidUtils工具类这是实际项目中最常用的写法public class DruidUtils { private static DataSource dataSource; static { try { // 加载配置文件 Properties props new Properties(); InputStream is DruidUtils.class.getClassLoader() .getResourceAsStream(druid.properties); props.load(is); // 创建连接池 dataSource DruidDataSourceFactory.createDataSource(props); } catch (Exception e) { throw new RuntimeException(Druid配置初始化失败, e); } } public static Connection getConnection() { try { return dataSource.getConnection(); } catch (SQLException e) { throw new RuntimeException(获取连接失败, e); } } // 释放连接实际项目会用框架自动管理 public static void release(Connection conn) { if (conn ! null) { try { conn.close(); } catch (SQLException e) { e.printStackTrace(); } } } }5.2 测试连接的正确姿势很多教程教人用main方法测试实际项目中更推荐用JUnitpublic class DruidTest { Test public void testConnection() { Connection conn null; try { conn DruidUtils.getConnection(); DatabaseMetaData metaData conn.getMetaData(); System.out.println(数据库产品名称: metaData.getDatabaseProductName()); System.out.println(驱动版本: metaData.getDriverVersion()); } finally { DruidUtils.release(conn); } } }测试时重点关注控制台输出正常应该显示MySQL版本信息。如果报错最常见的三种情况Communications link failure检查MySQL服务是否启动Access denied核对用户名密码SSL handshake确认useSSLfalse6. 高级配置与监控6.1 启用Web监控Druid自带监控页面配置起来非常简单。在web.xml中添加servlet servlet-nameDruidStatView/servlet-name servlet-classcom.alibaba.druid.support.http.StatViewServlet/servlet-class /servlet servlet-mapping servlet-nameDruidStatView/servlet-name url-pattern/druid/*/url-pattern /servlet-mapping启动项目后访问http://localhost:8080/druid输入配置的用户名密码需要在druid.properties中配置就能看到实时监控数据。这个页面特别有用能直观看到哪些SQL执行慢、连接池状态如何。6.2 SQL防火墙配置在properties文件中启用WallFilterfilterswall druid.wall.enabledtrue druid.wall.denyObjectstrue druid.wall.dropTableAllowfalse这样配置后Druid会自动拦截危险SQL比如DROP TABLE这种破坏性操作。有次我们项目被攻击就是靠这个功能挡住的。监控日志里会记录攻击尝试的IP和SQL语句对安全审计很有帮助。7. 常见问题排查7.1 连接泄露检测如果发现连接数持续增长不释放可能是连接泄露。在配置中开启泄露检测removeAbandonedtrue removeAbandonedTimeout1800 logAbandonedtrue这样当连接超过30分钟未关闭Druid会自动回收并打印警告日志。定位到问题代码后一定要用try-with-resources语法try (Connection conn DruidUtils.getConnection(); PreparedStatement ps conn.prepareStatement(sql)) { // 业务代码 }7.2 性能调优建议根据项目规模调整这些参数小型项目maxActive20, maxWait3000中型项目maxActive50, maxWait5000大型项目maxActive100, 配合分库分表关键指标监控活跃连接数持续接近maxActive说明需要扩容等待线程数经常大于0需要调大maxWait执行时间超过1秒的SQL要考虑优化最后提醒一点Druid的监控功能虽然强大但在生产环境要记得配置访问密码否则可能暴露敏感信息。配置方法是在druid.properties中添加druid.stat-view-servlet.login-usernameadmin druid.stat-view-servlet.login-passwordyour_strong_password