JAVA: MySql: zu viele Verbindung
Ich denke, dass meine Anwendung ist verflucht, Debuggen geht, wo er will, und ich weiß nicht, warum.
Zeile für Zeile Debuggen scheint zu analysieren, auch die auskommentierte Zeilen.
Ich denke, dass die Probleme auf meine Verbindung-Methode, sehe ich einen deutlichen Leistungsabfall, und am Dritten (oder vierten nvm) Verbindung ich bekomme diese Fehlermeldung:
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Too many connections
Ich bin mir sicher, dass ich die Verbindung zu schließen, jedes mal, wenn ich habe Zugriff auf die DB (mit finally-Anweisung aus dem try catch in der Umsetzung).
Hier ist meine connection-Klasse:
package Connection;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.rmi.RemoteException; import java.sql.*; import java.util.Properties;
public class ConnectionDB {
public static ResultSet rs = null;
public static Statement stat = null;
public static Connection cn = null;
public static void connect() throws RemoteException {
String dbHost="",dbUser="",dbPassword="";
Properties prop=new Properties();
try
{
//carico il file:
prop.load(new FileInputStream("***/config.properties"));
//Leggo le proprietà del file:
dbHost=prop.getProperty("host");
dbUser=prop.getProperty("user");
dbPassword=prop.getProperty("password");
}catch(FileNotFoundException fe){
System.out.println("config file not found");
}catch(IOException ex){
System.out.println("Error reading config file");
}
try
{
String driver = "com.mysql.jdbc.Driver";
Class.forName(driver);
dbHost = "jdbc:mysql://"+dbHost;
cn = DriverManager.getConnection(dbHost,dbUser,dbPassword);
stat = cn.createStatement();
}catch(SQLException e){
System.out.println("Can't connect to the DB");
}
catch(ClassNotFoundException cln){
System.out.println("Error using JDBC driver");
}
}
public static void disconnect() throws RemoteException {
try{
if(rs != null) rs.close();
if(stat != null) stat.close();
if(cn != null) cn.close();
}
catch(SQLException sqlEx){
System.out.println("Error: disconnect");
}
}
}
- stackoverflow.com/questions/1392304/...
- Wenn Sie das Kontrollkästchen in der Workbench, wie viele verbindungen tatsächlich öffnen? Weniger als die erlaubte maximale? Und sind alle verbindungen, die Sie wohl geschlossen werden, auch wirklich geschlossen?
- wie viele Male haben Sie call-Verbindung vorher trennen? eine weitere Sache .. jedes Ding ist statisch.. wenn Sie connect() connect() disconnect (), wie Sie jemals trennen die erste Verbindung?
- kann ich sehen, dass (mit netbeans als IDE)? Grundsätzlich ist die Verlangsamung kommt bei der ersten Verbindung, und ich weiß nicht warum...
- Ich denke, dass es besser ist, zu ändern meine eigenen "meine.cnf" - Datei, sodass mehr verbindungen, aber ich glaube nicht, dass das die Lösung ist, ist dies nur eine temporäre Lösung... (aber ich bin ein Anfänger so alle Vorschlag könnte groß sein für mich ^_^)
- Ich nenne die connect-Methode nur eine Zeit, die Verlangsamung kommt beim ersten verbinden, dann wird für jedes aufeinander folgende Verbindung, zu der diese Wirkung erhöhen viel, bis ich bekomme diese Fehlermeldung :S
- ok in der connect-Methode setzen Sie eine print-Anweisung, um zu sehen, wie oft es aufgerufen wird ( wenn es nur einmal aufgerufen werden, sollten Sie nicht bekommen, zu viele verbindungen Fehler).. die Einrichtung neuer verbindungen ist teuer, und es gibt Vorder-verbindungspools verwendet werden, um die Wiederverwendung von verbindungen (Siehe Antworten unten).. also für die Leistung die Verwendung von verbindungspools.. für die Fehler , ich glaube nicht, dass Sie nur nannte es einmal 🙂
- downloaden und installieren Sie MySQL Workbench CE, überprüfen Sie den server, während es läuft.
- Sie werden versuchen, ein singleton? Warum haben Sie ein statement und ein resultset als Mitglieder einer Klasse, die scheint, wie alle es tun sollten, ist schaffen eine Verbindung zu einer Datenbank?
- ja, ich versuche mit der Verbindung als singleton zur Verwaltung der Verbindung, btw es scheint nicht, eine schöne Lösung :S
- Ich schlage vor, Sie Profil Ihre app mit profiler, wie JVisualVM, schauen, welche Methode dauert die längste Zeit, dass problem lösen.
- Gelöst... nur @OsamaJaved Vorschlag, es war eine Methode, die (in einem Zyklus), die war ohne das richtige trennen Aufruf. Sorry für die "timewasting" und ich danke Euch allen!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Normalerweise gibt es begrenzte Anzahl von verbindungen für Benutzer. Darüber hinaus das herstellen von verbindungen ist kostspielig. Wenn Sie daher performance-Probleme feststellen, sollten Sie beginnen, mit dem Verbindungs-pool, Diskussion über connection-pools
Bezug auf Ihren code, stellen Sie sicher, dass Sie immer release-verbindungen in den finally-block. Auch wissen wir nicht, welche Art von Abfragen du ausführen. Drucken Sie Ihre Anfragen und versuchen, Sie manuell in mysql und sehen, ob die Probleme Ihres SQL, Java nicht. Auch Sie niemals in der Nähe FileInputStream heißt, Sie können aus dem Datei-Handler.
Bei der gleichen Anweisung in einer Schleife prüfen, mit PreparedStatements und batch updates und Transaktionen. Wenn Sie Transaktionen verwenden, stellen Sie sicher, dass Sie nicht viel Daten in den commit state.
Wenn Sie möchten, analysieren Sie die performance Ihrer Abfragen können Sie JAMon (Java Application Monitor)
Vorschlag auf Erhöhung der Anzahl von verbindungen, die ähnlich ist, die Beratung einer person mit Durchfall zu Essen mehr Nahrung.
Die disconnect-Methode kann müssen folgende Erweiterung. In dieser, schließen wir ResultSet, Statement & die Verbindung getrennt. So sparen Sie von der situation, in der einzelnen Ausnahme) nicht dazu führen, in nicht schließen des connection-Objekts.
Gibt es ein paar Optionen, die ich denke, Sie können ausprobieren:
Als in den Kommentaren gestellt, können Sie erhöhen Sie die maximale Anzahl der zulässigen verbindungen.
Sprachen Sie über performance-Einbußen. Wenn dies hat zu tun mit der Anzahl der Verbindung öffnen, ich würde vorschlagen, dass Sie prüfen, wiederverwenden der Verbindung. In diesem Szenario mit einem Verbindungs-pool vielleicht helfen. Dies könnte helfen in diesem Fall.
Wenn Sie eine Entwickler-version der Datenbank ist es wohl eine Beschränkung der Anzahl der verbindungen, die gemacht werden können. So müssen Sie zum verwalten Sie besser, was bedeutet, dass Sie sollten sicherstellen, dass Sie sind geschlossen, wenn Sie fertig sind mit Ihnen. (BEARBEITEN: gerade Begriffen, dass Sie mysql verwenden, so sollte dies kein Problem)
Auch, Sie haben erwähnt, dass der debugger wird durch Kommentare - dies ist typischerweise der Fall, wo der code wird synchron mit dem build. Reinigen Sie Ihre erstellen (in eclipse wäre es, Projekt - > sauber ... > reinigen Sie alle Projekte) und das problem sollte verschwinden.
Versuchen, diese