Druid
This content is not available in your language yet.
Druid 将数据库访问拆成连接池、JDBC 对象代理、过滤器链、SQL AST、安全检查和统计监控几层。它既是连接池,也是一个能够观察并约束 JDBC 行为的数据库访问基础设施。
本册问题地图
Section titled “本册问题地图”Druid 要同时看连接生命周期和 SQL 观测链:
- 连接池为什么能提速? 复用已经建立的连接,减少握手、认证和初始化成本;但池子不是越大越好,过多连接会把压力转移给数据库。
- 借出与归还各自承担什么? 借出要确认连接可用并占用资源,归还要清理事务和会话状态;只把对象放回队列不等于连接恢复干净。
- SQL Parser 为什么构造 AST? 统计、改写和安全检查都需要语义结构,AST 能区分真正的表名、函数和字符串内容。
- Filter 链为什么可插拔? 监控、统计、防火墙和日志关注点不同,链式过滤让它们在 JDBC 调用边界复用,而不改变业务代码。
- WallFilter 的边界是什么? 它降低危险 SQL 进入数据库的概率,但不能替代权限、参数化和数据库自身的安全策略。
| 项 | 值 |
|---|---|
| 仓库 | alibaba/druid |
| 本地路径 | E:\source\java\storage\druid |
| 分支 | master |
| Commit | fa8dc9912637a2f729eef9f55356621fec18d40e(2026-08-01) |
| 最近 tag | 1.2.28 |
本册坐标均基于上述 commit;行号随上游演进可能漂移。
| 模块 | 职责 | 关键类 |
|---|---|---|
pool |
连接创建、借还、回收和缩容 | DruidDataSource、DruidPooledConnection |
proxy |
包装 Connection、Statement、ResultSet | ConnectionProxyImpl、StatementProxyImpl |
filter |
统一扩展链 | FilterChainImpl、Filter |
sql |
SQL Parser、方言和 AST | SQLUtils、SQLStatementParser |
wall |
基于 AST 的 SQL 安全策略 | WallFilter、WallProvider |
stat |
SQL、连接和结果集统计 | StatFilter、DruidDataSourceStatManager |
support/http |
Web 统计与管理 | StatViewServlet、WebStatFilter |
读码入口顺序
Section titled “读码入口顺序”DruidDataSource#getConnection:先看连接如何借出。DruidPooledConnection#close:理解关闭为何变成回收。ConnectionProxyImpl和FilterChainImpl:跟踪 JDBC 调用如何逐层穿透。SQLUtils#parseStatements:从 SQL 字符串进入 AST。WallProvider#check、StatFilter:看安全和统计如何复用过滤器链。- Web Servlet:确认监控层如何消费统计对象。
| 对象 | 对照点 |
|---|---|
| HikariCP | Druid 过滤器、SQL 解析和 Web 监控更重;HikariCP 更专注连接池热路径 |
| ShardingSphere | Druid 负责 JDBC 观察与约束;ShardingSphere 继续做路由、改写和归并 |
| MyBatis | MyBatis 在上层组织 Mapper 和 Executor;Druid 位于 JDBC 访问边界 |