# java.sql.DriverManager.getConnection(Unknown Source)



## coder12 (12. Mrz 2009)

Also vorweg einmal ... der Code ist in modifizierter Art und Weise auch schon als Timertask funktionsfähig, jedoch mache ich das ganze in einem Thread da ich den in unterschiedlichen Intervallen aufrufen muss (mit sleep Befehl und dann mit this.run(); )

Der Fehler tritt nach einigen Stunden auf....

Die Fehlermeldung:
Exception in thread "Thread-4" java.lang.StackOverflowError
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClassInternal(Unknown Source)
at com.mysql.jdbc.Util.handleNewInstance(Util.java:426)
at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:302)
at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:282)
at java.sql.DriverManager.getConnection(Unknown Source)
at java.sql.DriverManager.getConnection(Unknown Source)
*at DB.news_info(DB.java:1824)*
at BroadcastServer2$news_info_bot.run(BroadcastServer2.java:279)
at BroadcastServer2$news_info_bot.run(BroadcastServer2.java:420)
at BroadcastServer2$news_info_bot.run(BroadcastServer2.java:420)
at BroadcastServer2$news_info_bot.run(BroadcastServer2.java:420)
*
at DB.news_info(DB.java:1824)..... betrifft->>
conn = DriverManager.getConnection( this.url, this.strDbUser, this.strDbPw );*


[HIGHLIGHT="Java"]public Vector news_info() throws SQLException
{
Connection conn = null;
        Statement stmt = null;
        ResultSet rSet = null;
        int retryCount = this.reConnect;
        boolean transactionCompleted = false;
        boolean okay = false;

Vector tmp = new Vector();
do{
try
{
conn = DriverManager.getConnection( this.url, this.strDbUser, this.strDbPw );
     stmt = conn.createStatement();
     String sqlQuery = "SELECT id,objekt,antwort FROM `news` WHERE zeige = 1";

     rSet = stmt.executeQuery( sqlQuery );
     while ( rSet.next() )
     {
     okay = true;
     tmp.add(rSet.getString(1));
     tmp.add(rSet.getString(2));
     tmp.add(rSet.getString(3));
     }

     if(okay){
     stmt.executeUpdate("UPDATE `news` SET `gezeigt` = '0' WHERE `news`.`id` ="+ tmp.elementAt(0).toString()+ " LIMIT 1 ;");
     }

     rSet.close();
    rSet = null;

        stmt.close();
        stmt = null;

        conn.close();
        conn = null;

        transactionCompleted = true;

} catch(Exception e) {
System.out.println("Fehler bei den news");
tmp.add("1");
     tmp.add("-- kein objekt --");
     tmp.add("keine news");
     return tmp;


    }finally {
        if (rSet != null) {
            try {
             rSet.close();
            } catch (SQLException sqlEx) {
             sql_log("67",true,sqlEx);
            }
        }

        if (stmt != null) {
            try {
                stmt.close();
            } catch (SQLException sqlEx) {
             sql_log("68",true,sqlEx);
            }
        }

        if (conn != null) {
            try {


                try {
                    conn.rollback();
                } finally {
                    conn.close();
                }
            } catch (SQLException sqlEx) {

                throw sqlEx;
            }
        }
    }
} while (!transactionCompleted && (retryCount > 0));

if(!okay){
     tmp.add("1");
     tmp.add("-- kein objekt --");
     tmp.add("keine news");
}
return tmp;
}[/HIGHLIGHT]


----------



## Geeeee (12. Mrz 2009)

StackOverflow allgemein deutet ja auf eine "miese" Rekursions- / Wiederholungstiefe hin. Irgendein Fehler bei der while-schleife evtl.?


----------



## coder12 (12. Mrz 2009)

das sollte doch mit der Exception abgefangen werden wenn ich " return tmp;" mache !!!???


----------



## Geeeee (12. Mrz 2009)

Ich spreche über die Zeile:
_82: while (!transactionCompleted && (retryCount > 0));_
Wenn, aus was für einem Grund auch immer, da niemals false rauskommt, läuft das ding ewig durch, bis der StackOverflow kommt. Da hilft dir es auch nicht eine Exception zu fangen, weil es ein Error ist.


----------



## coder12 (12. Mrz 2009)

retryCount ist von haus aus auf 3 gesetzt & transactionCompleted = true; sollte auch gesetzt werden ....


----------



## Geeeee (12. Mrz 2009)

Man könnte sich mal die Verbindungsaufbaugeschichte und den Threadaufruf genauer anschauen. Wenn du ihn 100x in der Sekunde aufrufst, wird der DriverManager noch getConnection abarbeiten, während du es schon wieder aufrufst.
Das ist nun eher eine theoretische Idee, aber da es nach einiger Zeit erst auftritt, könnte ein Grund eine längere Verarbeitungszeit der getConnection-Funktion sein (evtl. auch in Verbindung mit größerer Verzögerung der Verbindung zur Datenbank).


----------



## coder12 (12. Mrz 2009)

danke dir mal vorerst .... das merkwürdige ist ähnlicher code funktioniert im timertask ohne probleme mit dem selben aufbau

als thread mit sleep und this.run machts eben probleme

ich werde nun folgendes versuchen bei der do while schleife folgendes einfügen:
[HIGHLIGHT="Java"]do{
			retryCount--;[/HIGHLIGHT]


----------

