1

我认为我的应用程序被诅咒了,调试去了它想要的地方,我不知道为什么。逐行调试似乎也分析了注释行。我认为问题出在我的 Connection 方法上,我发现性能显着下降,并且在第三个(或第四个 nvm)连接处出现此错误:

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

我确定每次访问数据库时都会关闭连接(在实现中的 try catch 中使用 finally 语句)。

这是我的连接类:

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");
            }   
      }
}
4

5 回答 5

2

断开方法可能需要以下增强。在这一个中,我们分别关闭 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");
        }   
  }
于 2012-07-19T18:56:39.250 回答
0

我认为您可以尝试以下几种选择:

于 2012-07-19T15:39:04.270 回答
0

如果您使用的是数据库的开发人员版本,它可能对可以建立的连接数有限制。所以你需要更好地管理它们,这意味着你应该确保它们在完成后关闭。(编辑:刚刚意识到你正在使用 mysql,所以这应该不是问题)

此外,您提到您的调试器正在查看注释 - 这通常是您的代码与您的构建不同步的情况。清理你的构建(在 Eclipse 中它会是 Project > clean ... > clean all projects),这个问题应该会消失。

于 2012-07-19T15:57:34.737 回答
0

通常,可供用户使用的连接数量有限。此外,建立连接是一项昂贵的操作。因此,如果您遇到性能问题,您应该开始使用连接池, 关于连接池的讨论

关于您的代码,请确保您始终在 finally 块中释放连接。此外,我们不知道您运行什么样的查询。打印您的查询并尝试在 mysql 中手动运行它们,看看问题是否出在您的 SQL 上,而不是 Java 上。此外,您永远不会关闭 FileInputStream,这意味着您可能会用完文件处理程序。

如果您在循环中运行相同的语句,请考虑使用 PreparedStatements 以及批量更新和事务。如果您使用事务,请确保您没有太多处于未提交状态的数据。

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

增加连接数的建议类似于建议腹泻患者多吃食物。

于 2012-07-19T16:58:26.460 回答
0

试试这个

if(cn == null){
    String driver = "com.mysql.jdbc.Driver";
    Class.forName(driver);
    dbHost = "jdbc:mysql://"+dbHost;
    cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
}
于 2014-05-13T12:01:47.153 回答