java.sql.SQLException:连接太多(MariaDB)

时间:2019-08-03 12:44:51

标签: java sql mariadb

我有一个将结果发送到客户端的服务器。但是经过几次连接后,出现异常“ java.sql.SQLException:连接太多”。

首先,我调用GetLEDsSettings,此函数调用DBS.GetResult(),然后关闭连接。但是连接仍然有效。当我执行“显示状态,其中variable_name ='threads_connected';”在工作台中,我可以看到“ Threads_connected”仍在增加。重新启动程序后,所有连接都消失了

我从这些解决方案中尝试了一些方法: How to overcome "java.sql.SQLException: Too many connections" exception?MySql too many connections

LEDs.java:

private static String GetLEDsSettings() {

    ResultSet rs = DBS.GetResult("SELECT * FROM ExtLED01_LED");

    String res = "";

    try {

        while (rs.next()) {

            res += rs.getString("LEDname") + ";";
            res += rs.getString("Active") + ";";
            res += rs.getString("Color") + ";";
            res += rs.getString("LEDon") + ";";
            res += LEDcontroll.GetStatus(rs.getString("LEDname")) + ";";

        }

        rs.close();

        return res;

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        rs.close();
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    return null;

}

DBS.java:

公共静态ResultSet GetResult(字符串查询){

    ResultSet rs;

    try {

        TryConnect();
        rs = stmt.executeQuery(query);

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");

        Disconnect();

        return null;
        //e.printStackTrace();
    }finally {

        Disconnect();

    }

     return rs;
}

public static boolean ExecuteNonQuery(String query) {

    try {

        TryConnect();
        stmt.execute(query);

    } catch (SQLException e) {
        // TODO Auto-generated catch block
        //e.printStackTrace();
        ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");

        Disconnect();

        return false;

    }finally {

        Disconnect();
    }

    return true;
}

public static void Disconnect(){

    if (stmt != null) try { stmt.close(); } catch (SQLException logOrIgnore) {}
    if (conn != null) try { conn.close(); } catch (SQLException logOrIgnore) {}

}

public static boolean TryConnect() {


    if (JDBC_DRIVER == "" || DB_URL == "" || USER == "" || PASS == "") {

        return false;

    }else {

        try {

            conn = DriverManager.getConnection(DB_URL, USER, PASS);
            stmt = conn.createStatement();

            return true;

        } catch (SQLException e) {
            // TODO exception
            System.out.println("DEBUG1: " + e);
            ShellCommunication.SendCommand("LOG -M 'Chyba databáze: " + e.getMessage() + "'");
            return false;
        }

    }
}

1 个答案:

答案 0 :(得分:0)

每次程序查询数据库时,它都会打开一个新连接。如果它也不能关闭每个数据库(据我所知并没有),那么它一定会最终耗尽数据库支持的连接数量,而这正是正在发生的情况。

但是请注意,直到从ResultSet中读出查询结果之后,您才可以关闭连接,因为关闭连接也将关闭ResultSet。一个简单程序的通常解决方案是只打开一个连接,并将其重新用于所有查询。有多种方法可以使这种方法更可靠,但这将是一个单独的问题。