2012-04-06 66 views
3

我已經託管了一個MySQL數據庫網絡服務器。我授予的所有privledges,並允許我的IP遠程從我的本地計算機連接到該數據庫。它被連接起來,我可以從數據庫中檢索數據到我的Java Swing應用程序。但是,有時我收到此錯誤消息和我的與託管數據庫的連接失敗。 誤差如下所示:訪問遠程服務器時MySQL連接出錯

Apr 7, 2012 12:49:20 AM scm.new_fas txtSearchKeyReleased 
SEVERE: null 
com.mysql.jdbc.CommunicationsException: Communications link failure due to underlying exception: 

** BEGIN NESTED EXCEPTION ** 

java.io.EOFException 
MESSAGE: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. 

STACKTRACE: 

java.io.EOFException: Can not read response from server. Expected to read 4 bytes, read 0 bytes before connection was unexpectedly lost. 
    at com.mysql.jdbc.MysqlIO.readFully(MysqlIO.java:1997) 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2411) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3250) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3179) 
    at com.mysql.jdbc.Statement.executeQuery(Statement.java:1207) 
    at scm.DBControl.getResult(DBControl.java:49) 
    at scm.new_fas.txtSearchKeyReleased(new_fas.java:1686) 
    at scm.new_fas.access$2300(new_fas.java:28) 
    at scm.new_fas$23.keyReleased(new_fas.java:1136) 
    at java.awt.Component.processKeyEvent(Component.java:5999) 
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2794) 
    at java.awt.Component.processEvent(Component.java:5815) 
    at java.awt.Container.processEvent(Container.java:2058) 
    at java.awt.Component.dispatchEventImpl(Component.java:4410) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) 
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693) 
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657) 
    at java.awt.Component.dispatchEventImpl(Component.java:4282) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Window.dispatchEventImpl(Window.java:2429) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 


** END NESTED EXCEPTION ** 



Last packet sent to the server was 2 ms ago. 
    at com.mysql.jdbc.MysqlIO.reuseAndReadPacket(MysqlIO.java:2622) 
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:2916) 
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1631) 
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:1723) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3250) 
    at com.mysql.jdbc.Connection.execSQL(Connection.java:3179) 
    at com.mysql.jdbc.Statement.executeQuery(Statement.java:1207) 
    at scm.DBControl.getResult(DBControl.java:49) 
    at scm.new_fas.txtSearchKeyReleased(new_fas.java:1686) 
    at scm.new_fas.access$2300(new_fas.java:28) 
    at scm.new_fas$23.keyReleased(new_fas.java:1136) 
    at java.awt.Component.processKeyEvent(Component.java:5999) 
    at javax.swing.JComponent.processKeyEvent(JComponent.java:2794) 
    at java.awt.Component.processEvent(Component.java:5815) 
    at java.awt.Container.processEvent(Container.java:2058) 
    at java.awt.Component.dispatchEventImpl(Component.java:4410) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1848) 
    at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:693) 
    at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:958) 
    at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:830) 
    at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:657) 
    at java.awt.Component.dispatchEventImpl(Component.java:4282) 
    at java.awt.Container.dispatchEventImpl(Container.java:2116) 
    at java.awt.Window.dispatchEventImpl(Window.java:2429) 
    at java.awt.Component.dispatchEvent(Component.java:4240) 
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599) 
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273) 
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183) 
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168) 
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160) 
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:121) 

有人可以幫我這種情況。我不明白什麼是錯的!它是服務器還是? 非常感謝:)

這是我的同班同學連接DB:

package scm; 

import java.sql.Connection; 
import java.sql.DriverManager; 
import java.sql.ResultSet; 
import java.sql.Statement; 

public class DBControl { 

    private static DBControl con; 
    private static String severIp = null; 
    private static String severPort = null; 
    private static String userName = null; 
    private static String password = null; 
    private static ResultSet rs = null; 
    private static Connection cc = null; 

    public DBControl() { 
    } 

    public static synchronized DBControl getInstance() { 
     if (con == null) { 
      con = new DBControl(); 
     } 
     return con; 
    } 

    public void setSeverIp(String Ip) { 
     severIp = Ip; 
    } 

    public void setSeverPort(String Port) { 
     severPort = Port; 
    } 

    public void SetUserName(String Name) { 
     userName = Name; 
    } 

    public void setPassword(String passWord) { 
     password = passWord; 
    } 

    public static ResultSet getResult(String url) throws Exception { 
     Statement s = cc.createStatement(); 
     rs = s.executeQuery(url); 
     return rs; 
    } 

    public static Connection getConnection() throws Exception { 
//  try { 
     Class.forName("com.mysql.jdbc.Driver"); 
     cc = (Connection) DriverManager.getConnection("jdbc:mysql://" + getSeverIp() + ":" + getSeverPort() + "/anuradha_rr", getUserName(), getPassword()); 
     return cc; 
    } 

    public void setResult(String url) throws Exception { 
     Class.forName("com.mysql.jdbc.Driver"); 
     cc = (Connection) DriverManager.getConnection("jdbc:mysql://" + getSeverIp() + ":" + getSeverPort() + "/anuradha_rr", getUserName(), getPassword()); 
     Statement s = (Statement) cc.createStatement(); 
     s.executeUpdate(url); 
    } 

    public static String getSeverIp() { 
     return severIp; 
    } 

    public static String getSeverPort() { 
     return severPort; 
    } 

    public static String getUserName() { 
     return userName; 
    } 

    public static String getPassword() { 
     return password; 
    } 
} 

回答

3

確保您使用的不是死的JDBC連接。取決於你如何創建你的jdbc連接,他們可能會閒置。如果您反覆使用相同的連接,請在嘗試發出查詢之前先測試連接,如果已被mysql關閉,則獲取新連接。

UPDATE:

你到處創建一個新的連接之外的getResult(),這是在堆棧跟蹤標識錯誤的來源。您可以像創建其他地方一樣創建新連接,也可以改進getConnection()的封裝。換句話說,更改getConnection()以返回存儲在您的類中的靜態連接,條件是它不爲空且仍然有效。否則,創建一個新的連接並返回。

+0

感謝您的提示。但我該怎麼做? – wishman 2012-04-06 19:44:41

+0

您是直接調用連接還是使用數據庫抽象工具?如果您直接調用java.sql.Connection,請嘗試使用isValid(int timeout)方法。 – Dave 2012-04-06 19:56:31

+0

我剛剛編輯了我的問題,並添加了我的課程來連接數據庫。您能否善意地檢查它並告訴我應該在哪裏糾正它?非常感謝:) – wishman 2012-04-06 20:02:13

2

這是在MySQL中一個相當普遍的問題,遺憾的是在生產中通常只發生後,當應用程序運行於不同的開發週期短一些較長的時間。

MySQL的關閉連接,而不會通知客戶並沒有太大的告訴例外是當您嘗試使用一個超時連接顯示的內容。例如你可以定期用一些簡單的SQL語句來ping連接,以避免超時。

它是使用連接池(以避免過多的用戶訪問DB一次的問題),例如,一個很好的做法DBCP,一般來說。 DBCP可以很容易地添加到您的應用程序中,您只能將其設置爲準JDBC驅動程序。 在那裏你可以設置正確的方式。

我複製了我的一個項目這個DBCP配置:

    MaxActive=20, 
       MaxWait=60000, 
       TestWhileIdle=true, 
       TimeBetweenEvictionRunsMillis=300000, 
       MinEvictableIdleTimeMillis=300000, 
       TestOnBorrow=true, 
       ValidationQuery='SELECT 1' 

更新: 作爲一個非常簡單的解決方案,你可以嘗試追趕上訪問異常,並打開這種情況下,一個新的連接。