Druid 不提供内置 SQL 合并或批量统计 API,但可通过启用 stat Filter、使用 PreparedStatement.addBatch/executeBatch 分批执行、自定义 Filter 拦截记录、以及读取 SqlStat 获取累计指标实现高效批量操作与细粒度统计。

Druid 本身不直接提供“SQL 合并”或“批量执行统计”的内置 API,但可以通过合理使用其连接池、监控能力与 JDBC 原生机制(如 addBatch/executeBatch)配合自定义逻辑,实现高效批量操作和执行统计。关键在于:利用 Druid 的 Filter 机制 拦截 SQL、记录执行信息;结合 PreparedStatement 批量 API 实现合并插入/更新;再通过 Druid 的监控指标(如 ConnectionPoolStat、SqlStat)做运行时统计。
1. 开启 Druid 的 SQL 监控与统计功能
这是后续做执行统计的基础。需在 Druid 数据源配置中启用 stat Filter 并暴露监控端点:
- Spring Boot 示例(
application.yml):
datasource:
druid:
filters: stat,wall
web-stat-filter:
enabled: true
stat-view-servlet:
enabled: true
url-pattern: /druid/*
启动后访问 /druid 可查看实时 SQL 执行次数、平均耗时、并发数等——这些是“批量执行统计”的宏观依据。
2. 手动合并 SQL 实现批量写入(非自动拼接)
Druid 不会自动把多条 INSERT 合成一条(如 INSERT INTO t VALUES(...),(...)),需由业务代码控制。推荐方式:
立即学习“Java免费学习笔记(深入)”;
- 用
PreparedStatement.addBatch()累积参数,调用executeBatch()一次提交多行; - 对大批量数据,分批(如每 500 条一批)避免内存溢出和单次事务过长;
- 确保数据库驱动支持批量(MySQL 需加
rewriteBatchedStatements=true参数提升性能)。
示例(标准 JDBC + Druid 连接池):
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
try (Connection conn = dataSource.getConnection();
PreparedStatement ps = conn.prepareStatement(sql)) {
for (User u : users) {
ps.setString(1, u.getName());
ps.setInt(2, u.getAge());
ps.addBatch(); // 不执行,只缓存
}
int[] results = ps.executeBatch(); // 一次执行全部
System.out.println("成功插入 " + results.length + " 条");
}
3. 用 Druid Filter 自定义 SQL 执行统计(细粒度)
若需统计“某类批量操作的总耗时、调用次数、失败率”,可写一个自定义 Filter,拦截 statementExecuteQuery 或 statementExecuteUpdate 方法:
- 判断 SQL 是否含关键词(如
"INSERT INTO user"); - 记录开始时间、执行结果、异常信息;
- 聚合到线程安全的统计容器(如
ConcurrentHashMap+AtomicLong)。
简单统计器示例:
public class BatchStatFilter extends FilterEventAdapter {private final Map
@Override
public void statementExecuteUpdateBefore(FilterChain chain, ConnectionProxy connection, PreparedStatementProxy statement, String sql, int type) {
if (sql.trim().toUpperCase().startsWith("INSERT")) {
statsMap.computeIfAbsent(sql, k -> new BatchStats()).increment();
}
}
}
再将该 Filter 注册进 Druid 数据源即可跟踪指定 SQL 的执行频次。
4. 利用 Druid 内置 SqlStat 获取每条 SQL 的累计指标
Druid 在运行时维护了 SqlStat 对象,可通过 JMX 或编程方式获取:
- 获取所有已执行 SQL 的统计:
dataSource.getDataSourceStat().getSqlStatMap(); - 每个
SqlStat包含executeCount、executeMillisTotal、errorCount等字段; - 适合做离线分析或定时上报,比如统计过去 1 小时内所有
INSERT的平均批量大小(需结合日志或自定义参数解析)。
注意:SQL 字符串会被标准化(参数占位符化),相同结构的语句会归为同一条统计项,天然支持“合并后统计”。

















