首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

MySQL 重啟後連接失敗:Can't get hostname for your address 解決方案

     編輯:程式設計疑難解答

錯誤堆疊關鍵行

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: 
Communication link failure, message from server: "Can't get hostname for your address"

根本原因

MySQL 服務端嘗試對客戶端 IP 做**反向 DNS 解析**(獲取主機名),但 DNS 服務器無響應或無 PTR 記錄,導致握手超時/失敗。

解決方案(按推薦順序)

方案一:MySQL 配置跳過主機名解析(最快生效)

[mysqld]
skip_name_resolve = 1
# 重啟 MySQL 服務生效
  • 優點:立竿見影,無需改代碼。
  • 缺點:權限表 mysql.user 的 Host 列只能用 IP/通配符,不能用主機名。

方案二:修復 DNS / hosts 文件

  • 確保服務器 `/etc/resolv.conf` 可用,或在 `/etc/hosts` 添加客戶端 IP 映射:
192.168.1.50   client-hostname

方案三:JDBC 連接參數優化

jdbc:mysql://localhost:3306/db?useUnicode=true&characterEncoding=utf-8&
    connectTimeout=5000&socketTimeout=30000&
    autoReconnect=true&failOverReadOnly=false
  • 增加超時設置,避免 DNS 解析阻塞導致連接失敗。

驗證步驟

# 服務器上測試反向解析
dig -x 192.168.1.50
# 或
host 192.168.1.50
# 若超時/無記錄,確認是 DNS 問題

總結

Can't get hostname for your address 純屬 MySQL 服務端反向 DNS 解析失敗。生產環境**強烈建議開啟 skip_name_resolve=1**,同時確保權限表使用 IP 授權。配合 JDBC 超時參數,可徹底規避此類連接抖動。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved