JDBC连接错误

时间:2017-01-03 17:38:21

标签: java mysql jdbc resultset

我知道这可能与其他人有类似的问题,(原来,在我尝试新的东西之前,它有点独特但它从未解决主要问题),但我可能需要与能够讨论这个问题的人讨论这个问题。尽管已经阅读了本网站的各种帖子,但我无法得到导致这种情况的原因。最重要的是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。

我的程序所做的是它显示有关每个成员的数据,并且它是一种树或网络,为了获得每个成员所需的数据,您必须通过指向该成员的每个其他成员进行侦察。当前成员(或子数据),以及指向指向当前成员(或孙子数据)的成员的成员数据,依此类推。因此,为什么我需要继续进行查询,因为我需要从每个孩子那里获取数据。我认为每个节点至少有5个孩子,在我的第34个成员上,它给出了“Too Many Connections”错误。

我已经阅读过如何打开和关闭Connections以及所有这些但我仍然在做错了吗?我已经尝试过改变最大连接数,但这对我来说并不是一个长期的解决方案。我是这样做的:

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,因为它经常在循环中并且无论如何都被新数据替换。

同样,我的问题是:由于连接太多,我无法再继续获取数据。我真的关闭了事情还是我错过了什么?对于如何解决这个问题,有任何的建议吗?如果我的问题太混乱,我会在需要时添加更多细节。谢谢。如果有人热衷于自由地帮助我,我会去发一些电子邮件。谢谢!新年快乐顺便说一句。

1 个答案:

答案 0 :(得分:1)

您似乎正在创建大量连接并在ResultSet打开时进行递归。不要一直创建新的连接,只需要一个连接,不要一直重新连接。实际上您根本不需要重新连接方法(除非您自动关闭连接,在这种情况下,您可以在执行查询之前检查它是否已关闭)。完成检索值后,您需要关闭ResultSet。

您只需要数据而不是结果集。因此,获取数据并释放资源,即ResultSet。这样做 -

getMemberViaMemberId中不返回ResultSet,在该方法本身中,遍历结果集并为该行创建对象并将其存储到集合中并返回该集合之后关闭ResultSet 。并且根本不要调用reconnect方法。

关闭退出程序时的单个连接。