1. 课程背景与目标

1.1 数据库迁移的常见场景

数据库迁移是企业架构演进中不可避免的工程活动。根据迁移目标与范围,可将常见场景归纳为以下三类:

迁移场景 典型动因 技术挑战
云迁移 降低硬件成本、弹性扩缩容、托管运维 网络延迟变化、连接协议差异、云厂商限流策略
分库分表 单库容量瓶颈、写入吞吐不足、冷热数据分离 分布式事务、跨库查询、路由规则一致性
版本升级 安全补丁、新功能(如 MySQL 5.7 → 8.0) 驱动兼容性、SQL 语法变更、连接参数默认值变化
关键认知: 无论迁移类型如何,连接管理与内存模型的差异往往是故障的根源。迁移后的系统并非原样复制,而是运行在一个全新的运行时环境中。

1.2 迁移后典型故障概述

根据生产环境故障统计,数据库迁移后最常见的两类故障是连接池泄漏与GC 停顿。它们往往相互诱发,形成恶性循环。

迁移后典型故障关联图 数据库迁移 连接池泄漏 GC 停顿 应用获取连接超时 请求排队 → 线程阻塞 Full GC 频繁触发 应用暂停 → 接口超时 恶性循环:连接超时 → 重试 → 更多连接 → 更多对象 → 更频繁 GC
⚠ 常见误区: 很多团队在迁移后只关注 SQL 性能,而忽略了连接池配置与 JVM 堆内存的适配。实际上,连接池泄漏和GC 停顿是迁移后前 72 小时内最高频的 P0 故障原因。

1.3 连接池泄漏的典型表现

  • 现象: 应用日志频繁出现 Cannot get a connection, pool exhausted 或 Timeout: pool empty。
  • 根因: 连接未正确归还(connection.close() 未调用、异常分支未释放、事务拦截器失效)。
  • 迁移放大效应: 新环境连接超时时间、最大连接数、驱动版本变化导致原有代码的隐藏泄漏暴露。

1.4 GC 停顿的典型表现

  • 现象: 接口响应时间周期性飙升(秒级暂停),CPU 使用率下降,GC 日志显示 Full GC 频繁。
  • 根因: 迁移后连接池增大 → 活跃连接数上升 → 连接对象及关联缓存(PreparedStatement、ResultSet)占用堆内存 → 老年代膨胀。
  • 迁移放大效应: 新数据库驱动可能创建更多临时对象,或连接池默认的 maxLifetime 导致对象频繁晋升。

1.5 课程学习目标

完成本课程后,你将能够:

  1. 诊断连接池泄漏: 使用 JMX、HikariCP 指标、jstack 和连接池监控快速定位泄漏代码。
  2. 分析 GC 停顿根因: 通过 GC 日志、堆转储、JVM 参数调优识别迁移后的内存异常。
  3. 建立故障排查框架: 从“现象 → 指标 → 日志 → 代码”的递进式排查方法论。
  4. 制定迁移后稳定性清单: 连接池参数、JVM 参数、监控告警的标准化配置。

1.6 前置知识要求

领域 具体要求
Java 基础 理解 JDBC 连接管理、线程池、异常处理机制
JVM 基础 了解堆内存结构、GC 算法(CMS/G1)、GC 日志格式
数据库基础 熟悉连接池概念(HikariCP/Druid)、常见 SQL 执行流程
Linux 基础 能使用 top、jstat、jstack、netstat 等工具
💡 学习建议: 本课程包含大量实战案例和工具操作。建议准备一个测试环境(Java 8/11 + MySQL 8.0 + HikariCP),跟随课程步骤进行复现和排查练习。