Java 驱动程序无法创建到mysql的连接

Java 驱动程序无法创建到mysql的连接,java,mysql,database-connection,Java,Mysql,Database Connection,我正在用JavaSE编程,在尝试访问以创建到mysql的连接时出错。我可以连接到mysql,事实上,运行bucle时会出现错误。 我在这个程序中要做的是在我的数据库的表颜色中检查字符串,如果没有找到任何内容,它会在表中创建一个自动递增id的字符串。 它工作正常,但在检查了一段时间后,我发现了错误。 我将错误图像和代码附加到创建连接的位置。 此代码用于检查颜色是否已存在 编辑: 在您的代码中,您在每次呼叫时都会提供一个新连接,但您需要了解您的操作系统只允许有限的连接。 交叉限制后,它将不允许您进

我正在用JavaSE编程,在尝试访问以创建到mysql的连接时出错。我可以连接到mysql,事实上,运行bucle时会出现错误。
我在这个程序中要做的是在我的数据库的表颜色中检查字符串,如果没有找到任何内容,它会在表中创建一个自动递增id的字符串。
它工作正常,但在检查了一段时间后,我发现了错误。
我将错误图像和代码附加到创建连接的位置。

此代码用于检查颜色是否已存在

编辑:


在您的代码中,您在每次呼叫时都会提供一个新连接,但您需要了解您的操作系统只允许有限的连接。 交叉限制后,它将不允许您进行其他连接

我不知道你的要求是什么,但如果你真的需要连接

所以更好的选择是,您需要创建连接池。若用户需要一个连接来执行某些任务,那个么用户可以从连接池中获取连接,工作完成后,用户可以将该连接返回到连接池


为了实现这一点,您需要设计您的配置文件,或者您需要设计接口库接口,并根据您的需求进行实现

我找到了出路。我在谷歌上搜索了java错误提供给我的数字,发现添加一个注册表项来完成更多的连接应该是可行的。 我首先在服务器上做了这项工作,以允许更多来自客户端的连接,但它仍然不起作用,所以我尝试在我的计算机上做这项工作,现在它可以工作了。
问题在于
con
显然是一个成员变量,而它应该是一个局部变量。如果这段代码和其他类似的代码是从多个线程调用的,那么
con
值将被覆盖并因此丢失,从而导致连接泄漏。由于同时使用连接,您几乎肯定还会遇到其他问题。使其成为局部变量

注意:自2007年以来,您不再需要
Class.forName()
行。如果使用try with resources,则关闭连接、语句和结果集是多余的。你应该使用事先准备好的声明

String sql = "SELECT CODICOL FROM COLORES where COLOR =?";
try (con = DriverManager.getConnection(url, usuari, password);
        PreparedStatement st = con.prepareStatement(sql);
    ) {
        st.setObject(1, col);
        ResultSet res = st.executeQuery();
        if(res.next()){
            codi = res.getInt("CODICOL");
        }
    }
    catch(SQLException s){
        JOptionPane.showMessageDialog(null, "Error:\n"+s.getMessage(),
              "ERROR.",JOptionPane.ERROR_MESSAGE);
    }
}
catch (Exception ex)
{
    ex.printStackTrace();
}

使用netstat-an命令检查打开的套接字数量,并将限制与ulimitI使用的Windows进行比较,是否可以这样做?以前从未这样做过在每次通话中创建新连接,但旧连接似乎没有得到正确处理。您可能应该使用某种“持久连接”。关闭连接还不够吗?嗯,我以为是…我也会这么想。。但如果在多次尝试后显示错误,则似乎不正确。您已经移动了问题发生的点。你还没有解决这个问题。
url = "jdbc:mysql://192.168.1.200:3306/mybbdd?zeroDateTimeBehavior=convertToNull";
String sql = "SELECT CODICOL FROM COLORES where COLOR =?";
try (con = DriverManager.getConnection(url, usuari, password);
        PreparedStatement st = con.prepareStatement(sql);
    ) {
        st.setObject(1, col);
        ResultSet res = st.executeQuery();
        if(res.next()){
            codi = res.getInt("CODICOL");
        }
    }
    catch(SQLException s){
        JOptionPane.showMessageDialog(null, "Error:\n"+s.getMessage(),
              "ERROR.",JOptionPane.ERROR_MESSAGE);
    }
}
catch (Exception ex)
{
    ex.printStackTrace();
}