Ich weiß, das ist wahrscheinlich eine ähnliche Frage aus dem Rest, (gut ursprünglich, bevor ich etwas Neues versuchte, war es ein bisschen einzigartig, aber es löste nie das Hauptproblem), aber ich muss wahrscheinlich diskutieren dies mit jemandem, der helfen kann, weil ich nie bekommen konnte, was das verursacht, obwohl ich bereits verschiedene Beiträge von dieser Seite gelesen habe. Unter dem Strich muss ich weiterhin viele sequenzielle Abfragen machen, aber ich habe zu viele Verbindungen hergestellt.JDBC zu viele Verbindungen Fehler
Was mein Programm tut, ist, dass es Daten über jedes Mitglied anzeigt und dass es eine Art Baum oder Netzwerk ist, wo Sie alle anderen Mitglieder suchen müssen, die auf jedes Mitglied verweisen das aktuelle Mitglied (oder die Daten des Kindes) und die Daten des Mitglieds, das auf das Mitglied zeigt, das auf das aktuelle Mitglied (oder die Daten des Enkelkindes) zeigt und so weiter. Daher muss ich weiterhin Abfragen durchführen, weil ich die Daten von jedem Kind abfragen muss. Jeder Knoten hat ich denke, ein Minimum Kinder von 5 und auf meinem 34. Mitglied gab es, dass "Too Many Connections" Fehler.
Ich habe gelesen, wie man die Verbindungen und alle öffnet und schließt, aber mache ich es immer noch falsch? Ich habe versucht, die maximalen Verbindungen zu ändern, aber das ist nicht wirklich eine langfristige Lösung für mich. Hier ist, wie ich es tun:
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
So wie ich es in meinem jform nennen, ist dies ..
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){
}
}
Der Code:
connect.reconnect();
ResultSet rs = connect.callSQLMethod();
ist das wesentlichste Bit und heißt von jeder Klasse und von jeder Methode, die Daten abrufen muss. Ich muss zugeben, dass ich ResultSet nie schließen muss, weil es sich oft in einer Schleife befindet und trotzdem mit neuen Daten ersetzt wird.
Wieder ist mein Problem: Ich kann Daten nicht mehr abrufen wegen zu vielen Verbindungen. Schließe ich wirklich Dinge richtig oder verpasse ich etwas? Irgendwelche Vorschläge, wie Sie das beheben können? Wenn meine Frage zu verwirrend ist, würde ich bei Bedarf weitere Details hinzufügen. Vielen Dank. Wenn jemand Lust hat, mir zu helfen, würde ich ein paar E-Mails schreiben. Vielen Dank! Und Happy New Year übrigens.
Sie schließen die Verbindungen zu oft! – e4c5
Dies ist kein gutes Design, was passiert, wenn ein Ergebnissatz groß ist und Sie eine andere "CallSQLMethod" benötigen? –
Nun, wahrscheinlich ist mein Grund, Ausnahmen zu fangen, die sagen, dass ich nichts tun kann, um zu reagieren, da die Verbindung geschlossen wurde. Daher, warum ich diese Reconnect-Methode nenne. – yamahadinosaur