JDBC 连接错误太多
JDBC Too Many Connections Error
我知道这可能是其他人的类似问题,(最初,在我尝试新事物之前,它有点独特,但它从未解决主要问题),但我可能需要与某人讨论这个问题谁能提供帮助,因为尽管我已经阅读了该网站上的各种帖子,但我永远无法弄清楚是什么原因造成的。底线是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。
我的程序所做的是显示有关每个成员的数据,它有点像树或网络,为了获得每个成员所需的数据,您必须 scout 通过每个指向当前成员的其他成员(或 child 的数据),以及指向当前成员的成员的数据(或 grandchild 的数据)和很快。因此,为什么我需要继续进行查询,因为我需要从每个 child 中获取数据。我认为每个节点的最小 children 为 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();
是最重要的位,每个 class 和每个需要获取数据的方法都会调用它。我必须承认,我从不费心关闭 ResultSet,因为它经常处于循环中并且无论如何都会被新数据替换。
同样,我的问题是:由于连接太多,我无法继续获取数据。我真的正确地关闭了东西还是遗漏了什么?对于如何解决这个问题,有任何的建议吗?如果我的问题太混乱,我会根据需要添加更多详细信息。谢谢你。如果有人热衷于免费帮助我,我会去发一些电子邮件。谢谢!顺便说一句,新年快乐。
您似乎在打开 ResultSet 的情况下创建大量连接和递归。不要一直创建新连接,您只需要一个连接,不要一直重新连接。你实际上根本不需要重新连接方法(除非你的连接自动关闭,在这种情况下你可以在执行查询之前检查它是否关闭)。完成检索值后,您需要关闭 ResultSet。
您只需要数据而不是结果集。所以获取数据并释放资源即ResultSet
。所以这样做 -
在您的 getMemberViaMemberId
中,不要 return ResultSet
,在该方法本身中,遍历结果集并为行创建对象并将其存储到集合中,然后 return 该集合 在关闭 ResultSet 之后。并且根本不要调用 reconnect
方法。
退出程序时关闭您拥有的单个连接。
我知道这可能是其他人的类似问题,(最初,在我尝试新事物之前,它有点独特,但它从未解决主要问题),但我可能需要与某人讨论这个问题谁能提供帮助,因为尽管我已经阅读了该网站上的各种帖子,但我永远无法弄清楚是什么原因造成的。底线是我需要继续进行大量的顺序查询,但我最终建立了太多的连接。
我的程序所做的是显示有关每个成员的数据,它有点像树或网络,为了获得每个成员所需的数据,您必须 scout 通过每个指向当前成员的其他成员(或 child 的数据),以及指向当前成员的成员的数据(或 grandchild 的数据)和很快。因此,为什么我需要继续进行查询,因为我需要从每个 child 中获取数据。我认为每个节点的最小 children 为 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();
是最重要的位,每个 class 和每个需要获取数据的方法都会调用它。我必须承认,我从不费心关闭 ResultSet,因为它经常处于循环中并且无论如何都会被新数据替换。
同样,我的问题是:由于连接太多,我无法继续获取数据。我真的正确地关闭了东西还是遗漏了什么?对于如何解决这个问题,有任何的建议吗?如果我的问题太混乱,我会根据需要添加更多详细信息。谢谢你。如果有人热衷于免费帮助我,我会去发一些电子邮件。谢谢!顺便说一句,新年快乐。
您似乎在打开 ResultSet 的情况下创建大量连接和递归。不要一直创建新连接,您只需要一个连接,不要一直重新连接。你实际上根本不需要重新连接方法(除非你的连接自动关闭,在这种情况下你可以在执行查询之前检查它是否关闭)。完成检索值后,您需要关闭 ResultSet。
您只需要数据而不是结果集。所以获取数据并释放资源即ResultSet
。所以这样做 -
在您的 getMemberViaMemberId
中,不要 return ResultSet
,在该方法本身中,遍历结果集并为行创建对象并将其存储到集合中,然后 return 该集合 在关闭 ResultSet 之后。并且根本不要调用 reconnect
方法。
退出程序时关闭您拥有的单个连接。