2016-07-28 65 views
0

首先,我知道這個問題被問了很多次,但對我來說,再現的場景與我想的差不多(很可能)。通信鏈路故障發送到服務器的最後一個數據包是4毫秒前

對於mysql健康檢查,我們做一個簡單的選擇查詢(從雙重選擇1)。 一旦MySQL服務器去閒置了一段時間(約1分鐘),我們試圖健康檢查,我們得到這個問題..

通信鏈路故障\ n發送到服務器\ n上次數據包是4毫秒前

「message」:「無法讀取服務器的響應,預計會讀取4個字節,在連接意外丟失之前讀取0個字節」, 「stack」:[「com.mysql.jdbc.MysqlIO.readFully(MysqlIO .java:2431)「,」com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2882)「, 」com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2871)「, 」com。 mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.ja va:3414)「, 」com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1936)「, 」com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2060)「, 」com。 mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2536)「, 」com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2465)「, 」com.mysql.jdbc.StatementImpl.execute(StatementImpl。 Java的:734)」, 「org.apache.commons.dbcp.DelegatingStatement.execute(DelegatingStatement.java:264)」,

,如果我們立即再次嘗試,我們獲得成功的連接,一切工作正常。所以它的性質非常零星。

我看到這個計算器張貼com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

所以出這一切的可能性。我會回答一些在JDBC URL those-

  1. IP地址或主機名是錯誤的。 -NO(它可以在第二次嘗試通信失敗後)

  2. 主機名在JDBC URL不是由本地DNS服務器的認可。 -No(相同的理由,步驟1)

  3. 端口號丟失或錯誤的JDBC URL。 -No(相同的理由,步驟1)

  4. DB服務器已關閉。 -NO-(服務器啓動並運行)

  5. DB服務器不接受TCP/IP連接。 -No(相同的理由,步驟1)

  6. DB服務器已用盡連接。 -No(連接數1000我已經增加)

  7. 在Java和DB之間有物體擋住的連接,例如防火牆或代理。

是的。代理配置如下:

retries     3 
timeout http-request 10s 
timeout queue   1m 
timeout connect   10s 
timeout client   1m 
timeout server   1m 
timeout http-keep-alive 10s 
timeout check   10s 
maxconn     3000 

很少我的etc/my。CONF明細follows--

connect_timeout = 10 
wait_timeout  = 28800 
bind-address = 0.0.0.0 
max_connections = 1000 

對於創建連接,我使用的公共DBCP數據源(org.apache.commons.dbcp.BasicDataSource)

BasicDataSource dataSource = new BasicDataSource(); 
dataSource.setDriverClassName("com.mysql.jdbc.Driver"); 
dataSource.setUrl("url"); 
dataSource.setUsername("username"); 
dataSource.setPassword("pwd"); 
dataSource.getConnection(); 

請幫我找到什麼可以去錯了..是它的代理配置,導致問題或其他?幫助將不勝感激。

+0

我沒有看到移除[tag:mysql]標籤的意義,因爲MySQL的指紋都在堆棧跟蹤中。 – EJP

+0

Hai @EJP,謝謝你的時間。我刪除了mysql,因爲我正在使用的數據庫服務器是Percona服務器,它的方式不過是mysql,只是爲了確切地說,我已經刪除了mysql標記並添加了percona。 – RIPAN

+0

您正在使用MySQL JDBC驅動程序,這是異常來自的地方。 – EJP

回答

1
  1. JDBC URL中的IP地址或主機名是錯誤的。 -NO(它可以在第二次嘗試通信失敗後)

沒有,因爲你得到儘可能executeStatement(),這意味着你已經有了一個連接和PreparedStatement

  1. 本地DNS服務器無法識別JDBC URL中的主機名。 - 沒有(與步驟1相同的原因)

正確。

  1. 端口號在JDBC URL中丟失或錯誤。 - 沒有(與步驟1相同的原因)

正確。

  1. 數據庫服務器已關閉。 -NO-(服務器啓動並運行)

沒有找到相同的理由,(1),(2),(3)。

  1. DB服務器不接受TCP/IP連接。 - 沒有(與步驟1相同的原因)

正確。

  1. DB服務器已用完連接。 -No(I增加了連接的數量至1000)

沒有找到相同的理由,(1),(2),(3),(4),(5)。

  1. Java和DB之間的東西阻塞了連接,防火牆或代理。

否,爲相同的原因:(1),(2),(3),(4),(5),(6)。

您在建立連接後發生通信故障。這就排除了你在這裏提到的一切。剩下的是(a)服務器或網絡中的瞬態情況,(b)客戶端的連接池特性,(c)JDBC驅動程序提交的一些災難性錯誤的命令等等。最有可能的是(a)。

相關問題