MySQL-Zugriff: Connection.createStatement() hängt

Kryptaesthesie

Erfahrenes Mitglied
Hallo,
dieses Mal habe ich wohl leider einen schwierigeren Fall ...
Ich habe nicht von mir geschriebenen Code, wo ich jetzt aber doch einen Fehler finden muss.

Folgende Problemstellung:
Eine Weboberfläche mit mehreren Seiten. Wenn viele Abrufe sind, scheint die Verbindung zur Datenbank zu stolpern. Webseiten ohne DB-Anbindung können aufgerufen werden, bei welche mit DB-Anbindung tut sich nichts.

Das Problem scheint in folgender Methode zu liegen:
Code:
        public ResultSet getStaticResultSet(String sql) {
            ResultSet sqlErgebnis = null;
            try {
                Statement anfrage = verbindung.createStatement();
                sqlErgebnis = anfrage.executeQuery(sql);
                anfragen.add(anfrage);
            } catch(Throwable t) {
                logger.error("getStaticResultSet()", t);
            }
            return sqlErgebnis;
        }
Im Catch-Block kommt er nie an.
Bei
Code:
Statement anfrage = verbindung.createStatement();
ist Schluss. Beim Debuggen bleibt er da stehen und es geht nicht weiter.
Ich bin etwas ratlos, wo ich anfangen soll zu suchen. Wo kann ich ansetzen?
Habt ihr Ideen?
Was für Codeschnippsel braucht ihr noch um eine evtl. Fehlerquelle identifizieren zu können?

Vielen Dank schon mal für eure Hilfe!! :)
Gruß
Gerrit


PS: verbindung wird so zugewiesen: verbindung = DriverManager.getConnection(connections);


 
Wenn es sich um eine Webseite handelt solltest du doch aber lieber einen Pool verwenden oder?

Wenn du mit eclipse debuggst kannst du oben auf Pause klicken wenn er hängen bleibt. Dann wird dir angezeigt in welcher Methode er gerade hängt. Vielleicht hilft dir das schonmal etwas weiter.
 
Wenn es sich um eine Webseite handelt solltest du doch aber lieber einen Pool verwenden oder?
Stimmt :)
Ist in Planung, aber überstürzen kann ich / können wir da jetzt auch nichts.



Wenn du mit eclipse debuggst kannst du oben auf Pause klicken wenn er hängen bleibt. Dann wird dir angezeigt in welcher Methode er gerade hängt. Vielleicht hilft dir das schonmal etwas weiter.
Okay, das werde ich morgen bei der Arbeit direkt mal probieren.

Vielen Dank schon mal! :)
 
Ja aber wo ist das Problem? Commons DBCP in den Classpath, new BasicDataSource und dann getConnection() rufen. Ich vermute ehrlich gesagt auch, dass das Problem in dieser Ecke liegt. Du machst z.B. das Statement nicht wieder zu. Was ist mit den Connections, die du aufmachst?

JDBC lädt gerade dazu ein, Resourcenhandling falsch zu machen. IMHO gibt es nur zwei Optionen: notorisch aufs Resourcenhandling aufpassen (viel Aufwand und hässlicher Code) oder es einfach richtig machen: http://www.tutorials.de/forum/java-...tenbankzugriff-mit-springs-jdbc-template.html

REINHAUN!
 
Guten Morgen :)
Ja aber wo ist das Problem? Commons DBCP in den Classpath, new BasicDataSource und dann getConnection() rufen. ...
Überzeugt! Ich werde mal drängen, dass wir das angehen!

Die Datenbankklasse ist schon fast drei Jahre alt und lief bis jetzt immer problemlos.
Als ich vor ca. 8 Monaten zu dem Team dazugestoßen bin, sagt man mir aber schon, dass das bald ausgewechelt werden soll, aber dann sind die Tage einfach immer so schnell vorüber :p

Komisch an der ganzen Sache ist noch, dass der Zugriff auf PostgreSQL keine derartigen Probleme macht, sondern nur der Zugriff auf die MySQL-Datenbank.

Danke für eure Hilfe!
Gruß
Gerrit
 
Das kann durchaus vorkommen. Kannst du irgendwie rausbekommen, wieivele Connections dein Code zu der DB aufmacht? Die MySQL macht ab ner bestimmten Menge halt einfach keine mehr auf. Wenn man dann Connections nicht wieder sauber aufräumt, gehen einem halt irgendwann die Connections aus ;).

Gruß
Ollie
 
... Kannst du irgendwie rausbekommen, wieivele Connections dein Code zu der DB aufmacht? ...

Folgender Code steht im Constructor der Datenbankklasse:
Code:
private Connection verbindung;
Code:
String[] connections = {"jdbc:mysql://"+ DB_SERVER +"/A1?user=xyz&password=abc&autoReconnect=true"}
Code:
                  int i = 0;
                while(verbindung == null && i < connections.length)
                {
                    try
                    {
                        verbindung = DriverManager.getConnection(connections[i]);
                        break;
                    }
                    catch(SQLException sqle)
                    {
                        i++;
                        logger.error("", sqle);
                    }
                }
 
Das ist - diplomatisch ausgedrückt - eine sehr unkonventionelle Art und Weise eine Verbindung aufzumachen? Warum diese While-SChleife?

Wer macht die Connection wieder zu? Lässt du die die ganze Zeit offen oder machst du für jede Datenbankinteraktion eine neue auf? Das Problem am DriverManager ist, dass bei manuellem Connectionhandling eben genau solche Fragen manuell gelöst werden müssen.

Ich hatte mit meiner Frage allerdings eher darauf abgezielt, ob du zu Laufzeit irgendwie feststellen kannst wieviele Connection Objekte da rumfliegen. Den interessanten Part des Codes hast du ja ausgelassen, nämlich das Schließen der Connection ;).

Gruß
Ollie
 
... Wer macht die Connection wieder zu? Lässt du die die ganze Zeit offen oder machst du für jede Datenbankinteraktion eine neue auf?...
Okay, so wie es ausschaut, haben die Jungs das Schließen ausgelassen (darum kann ich dazu auch keinen Code liefern) ... wohl, da es nur eine Connection gibt.
Äußerst komisch. ;-] Je länger ich mir das so anschaue, möchte ich das neu machen!
 
Ähm ja :). Mein Rat: eine DataSource + das JdbcTemple (siehe meinen Link zu Tutorial oben) und es gibt zu 99% keinen stress mehr mit versehentlich nicht geschlossenen Resourcen :).

Gruß
Ollie
 
Zurück