java中jdbc统计sql执行行数和耗时的核心思路是:查询语句用system.nanotime()计时并遍历resultset或调用last()+getrow()获取行数;更新语句直接用executeupdate()返回值获影响行数;推荐统一封装为工具方法返回executionresult对象,并注意resultset关闭、游标类型及连接池兼容性。

Java 中用 JDBC 统计 SQL 执行行数和耗时,核心思路是:在执行前后记录时间戳,再结合 ResultSet 的遍历或 Statement 的返回值获取影响行数。注意不能依赖 getUpdateCount() 或 getRowCount() 直接得到查询结果集行数(它不实时反映结果集总行数),而应主动遍历或使用其他方式。
统计查询 SQL 的执行耗时和实际返回行数
对 SELECT 语句,耗时从 executeQuery() 开始算起,行数需遍历 ResultSet 才能准确获得(除非用 last()+getRow(),但要求可滚动游标):
- 调用
System.nanoTime()获取开始时间 - 执行
statement.executeQuery(sql) - 用
while (rs.next())遍历并累加计数;或若已知支持可滚动结果集,可先rs.last(); int count = rs.getRow(); rs.beforeFirst(); - 再用
System.nanoTime()获取结束时间,相减得纳秒级耗时
统计更新类 SQL(INSERT/UPDATE/DELETE)的受影响行数和耗时
这类语句不产生 ResultSet,直接返回整型影响行数,更简单:
在 Java 中初始化和管理阿里云 SDK客户端。包括单例模式、线程安全、endpoint 与 region 配置、VPC 终端节点、同步与异步等。
- 同样用
System.nanoTime()记录执行前后的差值 - 调用
statement.executeUpdate(sql),返回值即为数据库实际修改的行数 - 注意:该返回值由数据库驱动提供,可能与预期不符(如 MySQL 的
sql_mode含STRICT_TRANS_TABLES时,部分失败会返回 0)
统一封装统计逻辑(推荐做法)
避免每处都手写计时和计数,可封装一个工具方法:
- 接收
Connection、SQL 字符串、参数列表(用于预编译) - 内部创建
PreparedStatement,设置参数,记录起始时间 - 根据 SQL 类型(自动判断以
SELECT开头还是其他)分别调用executeQuery()或executeUpdate() - 返回自定义对象(如
ExecutionResult),含rowcount、durationNanos、success等字段
注意事项和常见陷阱
实际使用中容易忽略的关键点:
-
ResultSet 的行数统计不能依赖
getFetchSize()或getMetaData().getColumnCount()—— 前者是提示值,后者是列数 - 不要在未关闭
ResultSet或Statement时就统计耗时,否则测量不准确(网络延迟、GC 等干扰) - 高并发下直接用
System.nanoTime()安全,它不受系统时间调整影响 - 若用连接池(如 HikariCP),确保统计逻辑不干扰连接生命周期(例如不要在 close() 后还尝试读取结果)
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










