本文記錄一次線上 Java 服務因 MySQL Connector/J 驅動缺陷引發頻繁 Full GC 的完整根因分析 (RCA) 過程,包含現象觀測、堆棧分析、源碼追溯、壓測驗證與升級治理全鏈路。

jstack -l 顯示大量名為 MySQL Statement cancellation timer 的線程,對應 com.mysql.jdbc.CancelTask 對象大量堆積。

iBATIS 預設查詢超時 3 秒 (defaultStatementTimeout=3000)。JDBC 為每條 SQL 創建一個 CancelTask 並提交到全局 Timer 任務隊列:
CancelTask.run() 僅修改 Statement 狀態標記為「取消」CancelTask 對象在隊列中無限積壓

| 版本 | Timer 實現 | 缺陷 |
|---|---|---|
| mysql-connector-java-5.0.7 | 全局單一 Timer + 共享任務隊列 | CancelTask 無法及時清理,記憶體洩漏 |
| mysql-connector-java-5.1.34 | 每個 Connection 獨立 Timer,任務執行後自動移除 | 已修復,無積壓問題 |

15 分鐘後:


32 分鐘後:

堆內存對象統計:
CancelTask、PreparedStatement、byte[] (600M+)CancelTask,byte[] 僅數十 MB類型:維護問題 (依賴版本滯後)
關鍵詞:Java, JDBC, MySQL驅動, 頻繁大數據查詢, mysql-5.1.34, mysql-5.0.7
核心結論:頻繁的大數據查詢場景下,mysql-5.1.34 驅動的性能處理遠優於 mysql-5.0.7 驅動。一定要及時升級驅動!