線上系統拋出 Communications link failure,堆疊信息末尾隱藏著關鍵線索:java.net.SocketException: 打開的文件過多。本文記錄從現象到根因的完整排查過程。
Caused by: com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure
...
Caused by: java.net.SocketException: 打開的文件過多
at java.net.Socket.createImpl(Socket.java:447)
at com.mysql.jdbc.StandardSocketFactory.connect(StandardSocketFactory.java:257)
...
at org.apache.commons.dbcp.PoolingDataSource.getConnection(PoolingDataSource.java:106)
SocketException: 打開的文件過多,而非 MySQL 端拒絕連接ulimit -n 默認 1024,進程打開文件句柄超限將無法建立新 Socket 連接經代碼審查發現:某第三方 JAR 包中 InputStream 僅 new 打開,缺少 close() 調用,在高頻循環中反覆打開文件,導致句柄泄漏,最終突破 1024 限制。
try-with-resources 或 finally 中的 close()/etc/security/limits.conf 調大 nofile 限制InputStream/OutputStream/Reader/Writer/Socket/Connection 必須顯式關閉try-with-resources (Java 7+) 自動管理資源lsof -p 監控句柄數變化趨勢maxTotal、maxIdle 需小於系統文件句柄限制異常堆疊最底層往往藏著真相。不要被上層業務異常(如 Hibernate/JDBC 封裝)誤導,務必追溯到根因 Cause by 鏈的末端。