我知道这可能是一个类似的问题,从其余的,(原来,在我尝试新的东西,这是一个有点独特,但它从来没有解决主要问题),但我可能需要讨论这个人谁可以帮助,因为我永远无法得到什么原因,尽管已经阅读了各种帖子从这个网站。底线是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。
我的程序所做的是显示每个成员的数据,它有点像树或网络,为了获得每个成员所需的数据,你必须搜索指向当前成员(或子成员的数据)的每个其他成员,以及指向当前成员的成员的数据(或孙子的数据),依此类推。因此,为什么我需要不断地进行查询,因为我需要从每个孩子那里获取数据。我认为每个节点至少有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,因为它经常在一个循环中,并被替换为新的数据。
同样,我的问题是:由于连接太多,我无法继续获取数据。我是真的正确地结束了事情还是遗漏了什么?关于如何解决这个问题有什么建议吗?如果我的问题太让人困惑,如果需要的话,我会补充更多细节。谢谢您。如果有人想免费帮我,我会发邮件的。谢谢您!顺便说一句,新年快乐。
1条答案
按热度按时间von4xj4u1#
您似乎正在创建许多连接,并在结果集打开时递归。不要总是创建新的连接,你只需要一个连接,不要总是重新连接。实际上,您根本不需要reconnect方法(除非连接自动关闭,在这种情况下,您可以在执行查询之前检查它是否关闭)。一旦检索完值,就需要关闭resultset。
你所需要的只是数据,而不是结果集。因此,获取数据并释放资源ie
ResultSet
. 那就这么做吧-在你的
getMemberViaMemberId
别回来ResultSet
,在该方法本身中,遍历resultset并为行创建对象并将其存储到集合中,然后在关闭resultset后返回该集合。别打电话reconnect
方法。退出程序时关闭您的单个连接。