核心是精准捕获sql执行点与事务边界:对@transactional方法切面监控长事务耗时,对mapper方法切面提取慢sql;辅以datasource代理增强;所有监控需异步上报并脱敏参数。

在自定义 AOP 切面中监控 JDBC 慢 SQL 与长事务耗时,核心不是拦截“线程启动”或“事务开启方法”,而是精准捕获 SQL 实际执行点(如 PreparedStatement#execute)或事务边界内关键操作(如 TransactionTemplate#execute、@Transactional 方法),并结合上下文提取可审计信息。AOP 本身无法直接织入 JDK 底层 JDBC 类,因此需通过分层策略实现:对业务层事务方法做切面控制入口与出口,对数据访问层 SQL 执行做代理/增强或 AOP 拦截(如 MyBatis Mapper)。两者协同才能兼顾慢 SQL 和长事务。
监控长事务:切面拦截 @Transactional 方法
长事务本质是业务方法执行时间过长,且持有数据库连接或事务锁。可在服务层用 AOP 精准识别:
- 切点匹配带
@Transactional注解的方法(如@Pointcut("@annotation(org.springframework.transaction.annotation.Transactional)")),避免泛匹配影响性能 - 环绕通知中用
System.nanoTime()记录开始时间,在finally块中计算总耗时;若超阈值(如 5s),记录方法签名、参数(脱敏)、当前线程名、MDC 中的 TraceID 和 SpanID - 注意捕获异常后仍要统计耗时——事务回滚也可能很慢,不能只看成功路径
- 不建议仅靠
TransactionSynchronizationManager.isActualTransactionActive()判断是否在事务中,它无法反映耗时,仅作辅助验证
监控慢 SQL:优先拦截 DAO 层执行方法
SQL 执行发生在 DAO 层,AOP 最适合在此处切入,尤其当使用 MyBatis/MyBatis-Plus 时:
- 切点定义为 Mapper 接口方法(如
execution(* com.example.mapper..*Mapper.*(..))),比拦截 JDBC 更稳定、语义更清晰 - 环绕通知中调用
proceed()前记录起始纳秒,结束后计算耗时;超阈值(如 300ms)则提取真实 SQL:
– MyBatis 可通过BoundSql.getSql()+DefaultParameterHandler渲染参数(需反射或适配器)
– 或结合SqlSessionFactory和MappedStatement获取预编译 SQL 与绑定参数 - 日志内容至少包含:SQL 片段(截断防超长)、参数(敏感字段如 password、idCard 脱敏)、执行耗时、调用堆栈(
Thread.currentThread().getStackTrace())、线程名、TraceID
补充方案:DataSource 代理增强(通用但稍重)
当项目无 Spring 或需全局覆盖所有 JDBC 调用(含 JdbcTemplate、原生 JDBC)时,可包装 DataSource:
- 继承或装饰原始
DataSource,重写getConnection(),返回自定义ConnectionWrapper -
ConnectionWrapper包装Statement/PreparedStatement,在execute、executeQuery、executeUpdate前后埋点计时 - 获取真实 SQL 需处理占位符替换:对
PreparedStatement,可用 p6spy 的逻辑或自行实现简单参数填充(注意类型转换与 null 处理) - 该方式侵入性低、不依赖框架,但需确保所有数据源都经过该代理,且要注意连接池(如 HikariCP)的配置兼容性
异步上报与日志规范
监控动作必须异步,避免拖慢主业务流程:
- 构造结构化审计事件对象(如
SlowSqlEvent或LongTxnEvent),字段包括:类型、SQL/方法名、耗时、参数摘要、堆栈摘要、上下文 ID、时间戳 - 交由独立线程池(非 Tomcat 或业务线程池)异步发送至日志系统(Logback AsyncAppender)、消息队列(Kafka)或审计中台 API
- 生产环境禁用全量参数打印,启用白名单机制(如只记录
userId、orderId,忽略content、remark) - 日志级别设为
WARN或专用 logger(如logger = LoggerFactory.getLogger("SLOW_SQL")),便于 ELK 过滤与告警
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











