jdbc连接太多错误

o2g1uqev  于 2021-07-12  发布在  Java
关注(0)|答案(1)|浏览(375)

我知道这可能是一个类似的问题,从其余的,(原来,在我尝试新的东西,这是一个有点独特,但它从来没有解决主要问题),但我可能需要讨论这个人谁可以帮助,因为我永远无法得到什么原因,尽管已经阅读了各种帖子从这个网站。底线是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。
我的程序所做的是显示每个成员的数据,它有点像树或网络,为了获得每个成员所需的数据,你必须搜索指向当前成员(或子成员的数据)的每个其他成员,以及指向当前成员的成员的数据(或孙子的数据),依此类推。因此,为什么我需要不断地进行查询,因为我需要从每个孩子那里获取数据。我认为每个节点至少有5个子节点,在我的第34个成员上,它发出了“连接太多”的错误。
我已经阅读了如何打开和关闭连接,但我仍然做得不正确吗?我试过改变最大连接数,但这对我来说不是一个长期的解决方案。我是这样做的:

public class SQLConnect {

private Connection con;
private Statement st;
private ResultSet rs;

public SQLConnect() {
    try {
        Class.forName("com.mysql.jdbc.Driver");
        con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname?zeroDateTimeBehavior=convertToNull", "root", "");
        st = con.createStatement();

    } catch (ClassNotFoundException | SQLException ex) {
        System.out.println("Error in constructor: " + ex);
    }
}

//this method gets called before I make another query
public void reconnect() {
    try {
        st.close();
        con.close();
        if (con.isClosed()) {
            con = DriverManager.getConnection("jdbc:mysql://localhost:3306/dbname", "root", "");
            st = con.createStatement();
        }
    } catch (SQLException ex) {
        Logger.getLogger(SQLConnect.class.getName()).log(Level.SEVERE, null, ex);
    }
}

//sample method on how I do queries
public ResultSet getMemberViaMemberId(String mID) {
    try {
        String query = "CALL getMemberViaMemberId(" + mID + ");"; //procedure call
        rs = st.executeQuery(query);

    } catch (Exception ex) {
        System.out.println("Error: " + ex);
    }

    return rs;
}

}//end of class

在我的jform里我这样称呼它。。

SQLConnect connect;

public Class(){
   connect = new SQLConnect();
}

public void methodThatGetsCalledALot(String current_id){
    connect.reconnect(); //refer to SQLConnectClass displayed above
    ResultSet member = connect.getMemberViaMemberId(current_id);
    try{
        if (member.next()) {
            lastName = member.getString("last_name");
            firstName = member.getString("first_name");
        }

        //display data...
    } catch (SQLException ex){
    }
}

代码:

connect.reconnect();
ResultSet rs = connect.callSQLMethod();

是最基本的位,由每个类和每个需要获取数据的方法调用。我必须承认,我从来没有费心关闭resultset,因为它经常在一个循环中,并被替换为新的数据。
同样,我的问题是:由于连接太多,我无法继续获取数据。我是真的正确地结束了事情还是遗漏了什么?关于如何解决这个问题有什么建议吗?如果我的问题太让人困惑,如果需要的话,我会补充更多细节。谢谢您。如果有人想免费帮我,我会发邮件的。谢谢您!顺便说一句,新年快乐。

von4xj4u

von4xj4u1#

您似乎正在创建许多连接,并在结果集打开时递归。不要总是创建新的连接,你只需要一个连接,不要总是重新连接。实际上,您根本不需要reconnect方法(除非连接自动关闭,在这种情况下,您可以在执行查询之前检查它是否关闭)。一旦检索完值,就需要关闭resultset。
你所需要的只是数据,而不是结果集。因此,获取数据并释放资源ie ResultSet . 那就这么做吧-
在你的 getMemberViaMemberId 别回来 ResultSet ,在该方法本身中,遍历resultset并为行创建对象并将其存储到集合中,然后在关闭resultset后返回该集合。别打电话 reconnect 方法。
退出程序时关闭您的单个连接。

相关问题