JDBC Error "Too many Connections"

Diskutiere JDBC Error "Too many Connections" im AWT, Swing, JavaFX & SWT Bereich.
S

Selmau

Hallo Zusammen

Ich habe über JDBC eine Verbindung zu einer Datenbank aufgebaut und schreibe dort laufend Sachen hinein und lese diese aus. Das Problem ist nun aber, dass ich nach einer gewissen Zeit zu viele Verbindungen habe. Meine Idee war dann, dass ich die "Connection conn" mit conn.close wieder schliesse, nachdem ich die Dateien der Datenbank hinzugefügt habe. Jedoch erhalte ich dann beim nächsten senden den Fehler: "No operations allowed after Connection closing".

Hat Jemand von euch eine Idee, wie ich dies lösen kann, denn einfach die Anzahl Verbindungen erhöhen ist ja auch keine Lösung.

Hier noch mein Code:
Code:
public static Connection dbConnector ()
    {
    try {
        Class.forName("com.mysql.jdbc.Driver").newInstance();
        Connection conn=DriverManager.getConnection("jdbc:mysql://169.254.230.146/mealorder", "Benutzer", "Passwort");
    //    JOptionPane.showMessageDialog(null, "Connection sucessfull");
        return conn;
} catch (Exception e){
    //JOptionPane.showMessageDialog(null, e);
    return null;
}
}


Code:
public  void start_insert (){
     conn = sql_connection.dbConnector();
     if (conn==null){
         JOptionPane.showMessageDialog(null, "Verbindung zum Server nicht möglich! Bitte Server und WLan Verbindung überprüfen! ");}
         else{
         send_request();
         preparation_insert();
       
        }}


Code:
public  void insert_product_essen (int product_essen, int product_anzahl_e) {
       
       

    try {   
    //    Class.forName("com.mysql.jdbc.Driver").newInstance();
    //    Connection conn=DriverManager.getConnection("jdbc:mysql://192.168.43.13/mealorder", "'"+Home.user_database+"'", "Xjv58552");
        String query_essen = "Insert into Bestellungen_Essen_SNF (`Bestellnummer`, `Tisch`, `Produkt_E`, `Anzahl`, `ID`) values (?,?,?,?,?)";
        PreparedStatement pst_insert_essen=(PreparedStatement) conn.prepareStatement(query_essen);
       
        pst_insert_essen.setInt(1, Home.ordernummer_essen);    
        pst_insert_essen.setString(2, Home.tisch);
        pst_insert_essen.setInt(3, product_essen);    
        pst_insert_essen.setInt(4, product_anzahl_e);
        pst_insert_essen.setInt(5, Home.ID);
       
        pst_insert_essen.execute();
        //JOptionPane.showMessageDialog(null, "Bestellung abgeschickt");
       
        pst_insert_essen.close();
    }
    catch (Exception e){
       
        JOptionPane.showMessageDialog(null, "Fehler Hinzufügen Essen zu Datenbank");
    }
       
    }

Gruss

Samuel
 
VfL_Freak

VfL_Freak

Moin,
es ist nicht nachzuvollziehen, wo Du was aufrufst ...
Meine Idee war dann, dass ich die "Connection conn" mit conn.close wieder schliesse, nachdem ich die Dateien der Datenbank hinzugefügt habe. Jedoch erhalte ich dann beim nächsten senden den Fehler: "No operations allowed after Connection closing".
Das ist ja auch logisch! Du solltest die Connection halt vor jedem Senden wieder öffnen (und danach sauber schließen) !

VG Klaus
 
thet1983

thet1983

warum offen halten??

1. connection öffnen
2. statement ausführen
3. connection schliessen
 
D

Dukel

warum offen halten??

1. connection öffnen
2. statement ausführen
3. connection schliessen
Je nach Datenbank und Anwenung (wenn diese z.B. alle paar Sekunden oder Minuten Daten schreiben will) kann es günstiger sein die Verbindung offen zu halten als immer wieder öffnen und schliessen.
 
J

Joose

Die Lösung zu deinem Problem wurde dir ja schon genannt.

Eine Anmerkung zu deinem Code hätte ich aber -> verwende keine "_" für Namen (egal ob Methode, Klasse oder Variable)!
Verwende stattdessen die CamelCase Schreibweise :) https://de.wikipedia.org/wiki/Binnenmajuskel

Code:
public  void startInsert (){
....
         sendRequest();
         preparationInsert();
....      
}
Code:
public  void insertProductEssen(int productEssen, int productAnzahl) {
        // spar dir hier den postfix "essen" ... der Methodenname sagt ja schon was in die DB geschrieben wird.
        String query = "Insert into Bestellungen_Essen_SNF (`Bestellnummer`, `Tisch`, `Produkt_E`, `Anzahl`, `ID`) values (?,?,?,?,?)";
        PreparedStatement statement = (PreparedStatement) conn.prepareStatement(query);
      
        statement.setInt(1, Home.ordernummerEssen);   
        statement.setString(2, Home.tisch);
        statement.setInt(3, productEssen);   
        statement.setInt(4, productAnzahl);
        statement.setInt(5, Home.ID);
      
        statement.execute();
        statement.close();
    }
....
 
S

Selmau

Hallo Zusammen

Besten Dank für euro Tipps und Verbesserungsvorschläge. Ich habe das Problem mit den offenen Verbindungen nun gelöst, jedoch habe ich ab und zu immer noch einige Probleme, dass beim Schreiben bzw. Öffnen der Verbindung conn diese null bleibt. Probiert man dann nocheinmal, geht es meistens.

Ich glaube, dass das Problem ist, dass der Wamp server nicht für meine Anwendung ausgelegt ist, denn ich Schreibe die Daten von 5 verschiedenen Tablets auf einen Computer aufdem mein Wampserver installiert ist. Ich vermute, dass wenn zwei Geräte zum selben Zeitpunkt sich mit dem selben Benutzernamen beim Server anmelden wollen, kann der Server eine Anfrage nicht bearbeiten.

Hat jemand von euch eine Idee, ob dies das Problem ist oder wie man das Problem lösen kann?

Das mit der Verbindung einmal öffnen wollte ich zuerst auch machen, jedoch weiss ich nicht genau, wie man die Variable Connection conn für verschiedenen Klassen verwenden kann.

Besten Dank für eure Hilfe

Gruss Samuel
 
mrBrown

mrBrown

Wamp meint XAMPP?

Vor den DB-Server einen normalen Webserver schalten, damit die DB nicht offen im Netz hängt (und am besten auch kein Wamp für Produktivsysteme nutzen) ;)
 
S

Selmau

Wäre also ein XAMPP Server besser, bzw würde der ein gleichzeitiges Anmelden von zwei Geräten zulassen? Vielleicht würde sich das Problem auch lösen, wenn sich jedes Gerät mit einem anderen Benutzer anmelden würde?

Wegen dem Webserver vorschalten kommt für mich nicht in Frage, da das System in sich geschlossen ist und kein Zugriff zum Internet hat.
 
Thallius

Thallius

Sorry aber deine Aussage zum webservice ist kompletter Blödsinn.

Ein Webservice ist die einzig richtige Lösung. Deine direkten Verbindungen zur Datenbank sind ein absolutes NoGO das niemals professionell irgendwo so gemacht würde. Und nur weil du nicht weist was ein Webservice ist und wie das funktioniert ist das noch lange kein Grund zu sagen das kommt nicht in frage...
 
S

Selmau

Ja ich muss zugeben, in Sachen Serverwissen bin ich ein echter Anfänger, kannst du mir also genau erklären, was du mit einem Webservice meinst? Kann ich so die JDBC Verbindung trotzdem verwenden oder muss ich dies mit php oder so realisieren? Leider hatte ich bis anhin noch nie in diesem Bereich etwas realisiert und dies ist für mich absolut Neuland.
 
Thema: 

JDBC Error "Too many Connections"

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben