我的兩個(gè)程式中也遇到了同樣的問(wèn)題。我的錯(cuò)誤是這樣的:
com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.
我花了幾天時(shí)間才解決這個(gè)問(wèn)題。我測(cè)試了不同網(wǎng)站上提到的許多方法,但沒(méi)有一個(gè)有效。最後我更改了程式碼並找出了問(wèn)題所在。我將嘗試向您介紹不同的方法,並在此處進(jìn)行總結(jié)。
當(dāng)我在互聯(lián)網(wǎng)上尋找此錯(cuò)誤的解決方案時(shí),我發(fā)現(xiàn)有許多解決方案至少對(duì)一個(gè)人有效,但其他人說(shuō)這對(duì)他們不起作用!
strong> 為什麼有很多方法可以解決這個(gè)錯(cuò)誤? 看起來(lái)通常當(dāng)連接到伺服器時(shí)出現(xiàn)問(wèn)題時(shí),就會(huì)發(fā)生此錯(cuò)誤。也許問(wèn)題是因?yàn)殄e(cuò)誤的查詢字串或與資料庫(kù)的連接太多。所以我建議你一一嘗試所有的解決方案,不要放棄!
以下是我在網(wǎng)路上找到的解決方案,對(duì)於每個(gè)解決方案,至少有一個(gè)人的問(wèn)題已透過(guò)該解決方案解決。
提示:需要更改MySQL設(shè)定的解決方案可以參考以下檔案:
Linux:/etc/mysql/my.cnf
或/etc/my.cnf
(取決於Linux 發(fā)行版和使用的MySQL 軟體包) p>
Windows:C:\**ProgramData**\MySQL\MySQL Server 5.6\my.ini
(注意它是 ProgramData,而不是 Program Files)
更改bind-address
屬性:
取消註解 bind-address
屬性或?qū)⑵渥兏鼮橐韵?IP 之一:
bind-address="127.0.0.1"
或
bind-address="0.0.0.0"
註解掉「skip-networking」
#如果 MySQL 設(shè)定檔中有 skip-networking
行,請(qǐng)?jiān)谠撔械拈_(kāi)頭加上 # 符號(hào)將其註解。
更改「wait_timeout」和「interactive_timeout」
#將這些行新增到 MySQL 設(shè)定檔:
[wait_timeout][1] = *number* interactive_timeout = *number* connect_timeout = *number*
確保 Java 不會(huì)將「localhost」翻譯為 [:::1] 而不是 [127.0.0.1]
由於MySQL 可以辨識(shí)127.0.0.1
(IPv4
),但無(wú)法辨識(shí):::1
(IPv6
#)
可以透過(guò)使用以下兩種方法之一來(lái)避免這種情況:
在連線字串中使用127.0.0.1
而不是localhost
以避免localhost
被轉(zhuǎn)換為::: 1
使用選項(xiàng)-Djava.net.preferIPv4Stack=true
執(zhí)行java以強(qiáng)制java使用IPv4
而不是IPv6
。在 Linux 上,這也可以透過(guò)運(yùn)行(或?qū)⑵浞湃?/etc/profile
中來(lái)實(shí)現(xiàn):
export _JAVA_OPTIONS="-Djava.net.preferIPv4Stack=true"
檢查作業(yè)系統(tǒng)代理設(shè)定、防火牆和防毒程式
確保防火牆或防毒軟體沒(méi)有封鎖 MySQL 服務(wù)。
在 Linux 上暫時(shí)停止 iptables。如果 iptables 設(shè)定錯(cuò)誤,它們可能允許 tcp 封包發(fā)送到 mysql 端口,但阻止 tcp 封包返回相同連接。
# Redhat enterprise and CentOS systemctl stop iptables.service # Other linux distros service iptables stop
停止 Windows 上的防毒軟體。
更改連接字串
檢查您的查詢字串。你的連接字串應(yīng)該是這樣的:
dbName = "my_database"; dbUserName = "root"; dbPassword = ""; String connectionString = "jdbc:mysql://localhost/" + dbName + "?user=" + dbUserName + "&password=" + dbPassword + "&useUnicode=true&characterEncoding=UTF-8";
確保字串中沒(méi)有空格。所有連接字串都應(yīng)該連續(xù),沒(méi)有任何空格字元。
嘗試將「localhost」替換為環(huán)回位址 127.0.0.1。 也嘗試將連接埠號(hào)碼新增至連接字串中,例如:
String connectionString = "jdbc:mysql://localhost:3306/my_database?user=root&password=Pass&useUnicode=true&characterEncoding=UTF-8";
通常 MySQL 的預(yù)設(shè)連接埠是 3306。
不要忘記將使用者名稱和密碼更改為您的 MySQL 伺服器的使用者名稱和密碼。
#「max_allowed_pa??cket」是MySQL 設(shè)定檔中的一個(gè)變量,指示最大資料包大小,而不是最大資料包數(shù)量。所以這對(duì)解決這個(gè)錯(cuò)誤沒(méi)有幫助。
將 TOMCAT6_SECURITY=yes 改為 TOMCAT6_SECURITY=no
使用validationQuery="select now()"確保每個(gè)查詢都有回應(yīng)
#將此程式碼新增至您的連接字串:
&autoReconnect=true&failOverReadOnly=false&maxReconnects=10
雖然這些解決方案都不適合我,但我建議您嘗試一下。因?yàn)橛行┤税凑者@些步驟解決了他們的問(wèn)題。
但是是什麼解決了我的問(wèn)題呢?
我的問(wèn)題是我在資料庫(kù)中有很多 SELECT。每次我創(chuàng)建連接然後關(guān)閉它。雖然我每次都關(guān)閉連接,但是系統(tǒng)面臨很多連接並給了我這個(gè)錯(cuò)誤。 我所做的是將連接變數(shù)定義為整個(gè)類別的公共(或私有)變量,並在建構(gòu)函數(shù)中初始化它。 然後每次我使用該連接時(shí)。它解決了我的問(wèn)題,也大大提高了我的速度。
#結(jié)論# 沒(méi)有簡(jiǎn)單且獨(dú)特的方法來(lái)解決這個(gè)問(wèn)題。建議您結(jié)合自身情況考慮,選擇以上解決方案。如果您在程式開(kāi)始時(shí)出現(xiàn)此錯(cuò)誤並且根本無(wú)法連接到資料庫(kù),則您的連接字串可能有問(wèn)題。但是,如果您在與資料庫(kù)進(jìn)行多次成功交互後出現(xiàn)此錯(cuò)誤,則問(wèn)題可能出在連接數(shù)上,您可能會(huì)考慮更改“wait_timeout”和其他 MySQL 設(shè)置,或者重寫代碼以減少連接數(shù)。