2013-11-15 190 views
0

我的數據庫在過去有過更多的問題:它不能總是獲得連接。數據庫運行在網站上(虛擬主機),我嘗試從我自己的PC上訪問它。這裏出了問題,如果我從localhost訪問它到localhost,那麼它工作正常。無法連接到MySql數據庫

錯誤,那是我在Java中獲得:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.

我不知道爲什麼,我使用的是類似的結構如初,即如下:

public class SQL { 
    private final static String USERNAME = ""; 
    private final static String PASSWORD = ""; 
    private final static String URL = "jdbc:mysql://www.fvheeswijk.nl:3306/p28004_bf4"; 

    private static Connection cachedConnection; 

    private static void createConnection() { 
     cachedConnection = null; 
     Properties connectionProperties = new Properties(); 
     connectionProperties.put("user", USERNAME); 
     connectionProperties.put("password", PASSWORD); 
     try { 
      cachedConnection = (Connection) DriverManager.getConnection(URL, connectionProperties); 
     } catch (SQLException ex) { 
      Logger.getLogger(SQL.class.getName()).log(Level.SEVERE, null, ex); 
     } 
    } 

    public static Connection getConnection() { 
     if (cachedConnection == null) { 
      createConnection(); 
     } 
     return cachedConnection; 
    } 
} 

的數據被削除,當然。

然後我試着ping我的網站,都很好。

後來我試圖平www.fvheeswijk.nl:3306,數據庫,但Windows CMD無法找到它。然後我試着通過瀏覽器訪問它(這是否有意義?),但是我收到了一些信息:「無序接收的數據包」。我已經(之前的方式)將我的PC(路由器/網絡)主機名添加到數據庫允許的主機列表中。

任何線索或建議是什麼問題?

編輯:現在我得到這個,或許可以解釋的東西... java.sql.SQLException: null, message from server: "Host '541DB0AA.cm-5-6c.dynamic.ziggo.nl' is blocked because of many connection errors; unblock with 'mysqladmin flush-hosts'"

回答

2

主要的問題是,您打開太多的連接,並可能永遠不會關閉它們或它們正在由應用服務器關閉(或任何你運行這個應用程序的地方)。這可以從你的文章中的兩個事實知道:

  • private static Connection cachedConnection。數據庫連接一定不能被手動緩存,相反它應該檢索只需需要時,和關閉後被使用。
  • com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: No operations allowed after connection closed.此錯誤非常明確,您正嘗試使用已關閉的連接。手動

此外,你天真地打開連接,這在這裏要注意:

cachedConnection = (Connection) DriverManager.getConnection(URL, connectionProperties); 

要解決所有這些問題,你應該移到database connection pool。簡而言之,連接池將打開一堆物理數據庫連接,並保持它們處於睡眠狀態,並按需喚醒連接,然後在關閉連接時,而不是關閉物理連接,它將返回到睡眠狀態,從而節省開啓新連接的時間。

更多信息:


關於你的最後的編輯,似乎是Y你需要關閉一些到你的數據庫的連接。您應該kill some of them並嘗試使用數據庫池再次連接。

+0

好的,我會毫不猶豫地看看它,因爲總會有*一些*問題,雖然依賴於應用程序他們可能會更嚴重。我沒有使用任何容器環境,所以我希望有連接池的簡單實現。我知道我正在使用一個已經關閉的連接,但是我無法對這個連接做任何事情,也不能手動關閉它,因此我感到困惑。 – skiwi

+0

@skiwi在我的答案的更多信息部分的最後一個鏈接中,有一些數據庫連接池庫可以在您的應用程序中使用。 –

+0

我將使用apache commons dbcp,但是我已經過去了幾分鐘,但已經啓用了在不使用容器環境的情況下爲DBCP找到全面的教程。你碰巧知道嗎? – skiwi