2012-07-19 87 views
0

我認爲我的應用程序被詛咒,調試去了它想要的地方,我不知道爲什麼。 逐行調試似乎也分析了註釋的行。 我認爲,這些問題是在我的連接方法,我看到一個顯著性能下降,並且在第三(或第四NVM)方面,我得到這個錯誤:JAVA:MySql:太多的連接

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections 

我敢肯定,我關閉連接每次我訪問數據庫時(最終的聲明都不在實現中的try catch中)。

這裏是我的連接類:

package Connection; 

import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; import java.sql.*; import java.util.Properties; 

public class ConnectionDB {   
    public static ResultSet rs = null; 
    public static Statement stat = null;  
    public static Connection cn = null; 

    public static void connect() throws RemoteException  { 
      String dbHost="",dbUser="",dbPassword=""; 
      Properties prop=new Properties(); 
      try 
      { 
       //carico il file: 
       prop.load(new FileInputStream("***/config.properties")); 
       //Leggo le proprietà del file: 
       dbHost=prop.getProperty("host"); 
       dbUser=prop.getProperty("user"); 
       dbPassword=prop.getProperty("password"); 
      }catch(FileNotFoundException fe){ 
       System.out.println("config file not found"); 
      }catch(IOException ex){ 
       System.out.println("Error reading config file"); 
      } 
      try 
      { 
       String driver = "com.mysql.jdbc.Driver"; 
       Class.forName(driver); 
       dbHost = "jdbc:mysql://"+dbHost; 
       cn = DriverManager.getConnection(dbHost,dbUser,dbPassword); 
       stat = cn.createStatement(); 
      }catch(SQLException e){ 
       System.out.println("Can't connect to the DB"); 
      } 
      catch(ClassNotFoundException cln){ 
       System.out.println("Error using JDBC driver"); 
      } 
    } 

    public static void disconnect() throws RemoteException { 
      try{ 
       if(rs != null) rs.close(); 
       if(stat != null) stat.close(); 
       if(cn != null) cn.close(); 
      } 
      catch(SQLException sqlEx){ 
       System.out.println("Error: disconnect"); 
      } 
     } 
} 
+0

http://stackoverflow.com/questions/1392304/com-mysql-jdbc-exceptions-jdbc4-mysqlnontransientconnectionexception-in-mysql – kosa 2012-07-19 15:23:50

+0

如果您在工作臺檢查,怎麼樣許多連接實際上是開放的?小於允許的最大值?你認爲所有關閉的連接是否也關閉? – fvu 2012-07-19 15:25:51

+3

在斷開連接之前您打幾次連接?還有一件事..每件事情都是靜態的..如果你連接()connect()disconnect()你將如何斷開第一個連接? – 2012-07-19 15:41:01

回答

0

正常情況下,用戶的可用連接數量有限。另外,建立連接是昂貴的操作。因此,如果你遇到性能問題,你應該開始使用連接池,discussion about connection pools

關於你的代碼,確保你總是在finally塊中釋放連接。我們也不知道你運行的是什麼類型的查詢。打印您的查詢並嘗試在mysql中手動運行它們,並查看問題是否是您的SQL,而不是Java。此外,你永遠不會關閉FileInputStream,這意味着你可以用完文件處理程序。

如果您在循環中運行相同的語句,請考慮使用PreparedStatements以及批量更新和事務。如果您使用事務,請確保您沒有太多數據處於未提交狀態。

如果你需要分析你的查詢性能,您可以使用JAMon (Java Application Monitor)

建議增加連接數類似於一個人腹瀉建議吃更多的食物。

0

如果您使用數據庫的開發者版本,它可能會對可以建立的連接數量進行限制。所以你需要更好地管理它們,這意味着當你完成它們時你應該確保它們被關閉。 (編輯:剛剛意識到你使用MySQL所以這不應該是一個問題)

另外,你提到你的調試器正在經歷的意見 - 這通常是在您的代碼之間不同步的情況下你的構建。清理你的構建(在eclipse中它會是項目>清理...>清理所有項目),該問題應該消失。

+0

我試圖清理所有項目,但同步問題仍然存在:( – Stiva 2012-07-19 16:18:30

1

斷開方法可能需要以下增強。在這個中,我們分別關閉ResultSet,Statement & Connection。這可以節省單個異常不會導致不關閉連接對象的情況。

public static void disconnect() throws RemoteException { 
     try{ 
      if(rs != null) rs.close(); 
     } 
     catch(SQLException sqlEx){ 
      System.out.println("Error: disconnect"); 
     } 


     try{ 
      if(stat != null) stat.close(); 
     } 
     catch(SQLException sqlEx){ 
      System.out.println("Error: disconnect"); 
     } 

     try{ 
      if(cn != null) cn.close(); 
     } 
     catch(SQLException sqlEx){ 
      System.out.println("Error: disconnect"); 
     } 
    } 
0

試試這個

if(cn == null){ 
    String driver = "com.mysql.jdbc.Driver"; 
    Class.forName(driver); 
    dbHost = "jdbc:mysql://"+dbHost; 
    cn = DriverManager.getConnection(dbHost,dbUser,dbPassword); 
}