2017-01-03 5 views
-1

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.

+0

Sie schließen die Verbindungen zu oft! – e4c5

+0

Dies ist kein gutes Design, was passiert, wenn ein Ergebnissatz groß ist und Sie eine andere "CallSQLMethod" benötigen? –

+0

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

Antwort

1

Sie scheinen eine Menge von Verbindungen zu erstellen und rekursiv mit dem geöffneten ResultSet. Erstellen Sie nicht ständig neue Verbindungen, Sie benötigen lediglich eine Verbindung und verbinden sich nicht ständig neu. Sie benötigen die Reconnect-Methode überhaupt nicht (es sei denn, die Verbindung wird automatisch geschlossen. In diesem Fall können Sie prüfen, ob sie vor dem Ausführen der Abfrage geschlossen wurde). Und Sie müssen das ResultSet schließen, sobald Sie mit dem Abrufen von Werten fertig sind.

Sie brauchen nur die Daten und nicht die Ergebnismenge. Also nimm die Daten und gib die Ressource frei, zB ResultSet. Also das tun -

In Ihrem getMemberViaMemberId nicht ResultSet zurückkehren, in diesem Verfahren selbst, durchlaufen die resultset und erstellen Sie das Objekt für die Zeile und speichern sie in einer Sammlung und bringe diese Sammlung nach dem ResultSet schließen. Und rufen Sie nicht reconnect Methode überhaupt.

Schließen Sie die einzelne Verbindung, die Sie beim Beenden des Programms haben.

+0

Ihre Antwort sieht gut aus, da sie meine Verwirrung darüber, wie ich sie neu kodieren sollte, ein wenig löscht und ich werde mich wieder an Sie wenden, sobald ich das implementiert habe. Aber Sie haben eine Sache richtig verstanden, die Verbindung schließt sich automatisch und ich bekomme einen Fehler, der besagt, dass die Ursache nach dem Schließen der Verbindung nicht behoben werden kann. Deshalb habe ich wegen dieses Fehlers reconnect erstellt und zusätzlich con.close() angehängt, bevor ich die Verbindung neu anlege, um sicherzugehen, dass sie sicher geschlossen ist. – yamahadinosaur

Verwandte Themen