# Threads bei DBConnection



## Helmut84 (20. Feb 2008)

Hello! Ich bin zur Zeit mit meinem ersten parallel Projekt beschäftigt und bin auf ein Problem gestoßen! Hoffe, dass ich hier informationen finde, was ich tun kann bzw. was eigentlich genau passiert: Es ist so, dass ich im Moment eigentlich alles auskommentiert habe und eigentlich nur eine Connection öffne und wieder schließe! Trotzdem habe ich dann, wenn ich Thread.activeCount() sage 2 Threads! Wenn ich das erstellen und schließen der Connection auskommentiere hab ich nur einen Thread -> main! woran liegt das?? Hoffe auf eure Hilfe!!!!


----------



## L-ectron-X (20. Feb 2008)

Code?


----------



## Helmut84 (20. Feb 2008)

```
import java.sql.Connection;

public class MyClass{
  public static void main(String args[]){
   ConnectorDB conDB=new ConnectorDB();
   Connection con=conDB.getConnection("DB");
   try{
       if(con != null) conDB.connClose(conSTO);
   }catch(Exception ex){
      System.out.println(ex);
   }
   int active=Thread.activeCount();
   System.out.println(active);
 }
}
```

ConnectorDB ist nur eine Klasse die mir aus einem File die Informationen für Connections ausliest und mit getConnection eine Connection liefert bzw. mit connClose die übergebene connection schließt!


_L-ectron-X hat diesen Beitrag am 20.02.2008 um 16:51 Uhr editiert._
_Code-Tags eingefügt._


----------



## ARadauer (20. Feb 2008)

kann ja leicht sein, dass jdbc im hintergrund noch einen thread aufmacht um,..mhmn keine ahnung zb die verbindung aufrecht zu erhalten...


----------



## Helmut84 (20. Feb 2008)

hmm... aber wenn ich die Connection schließe sollte dieser Thread ja auch beendet werden, oder??? denn wie kann ich mir sicher sein, dass das Programm alle Threads sauber beendet und keine Threads im System stehen bleiben??


----------



## ARadauer (20. Feb 2008)

naja das objekt gibt es ja noch. ich würd mir persönlich keine sorgen machen, ob mysql oder oracle seine jdbc treiber so sauber programmiert haben, dass alles sauber beendet wird.

was gäbe es den für schlimme konsequenzen wenn da noch ein tread offen ist?


setzt mal con =null; und ruf System.gc(); auf.
(wobei das auch keine garantie ist, das der GarbageCollector sofort läuft.) Vorher vielleicht noch ein sleep.....

häng das mal dran


```
int active=Thread.activeCount(); 
	   System.out.println(active);
	   con=null;
	   System.gc();
	   try {
	  	 Thread.sleep(2000);
		}
		catch (Exception e) {}
		active=Thread.activeCount(); 
	   System.out.println(active);
```

würd mich persönlich jetzt auch interessieren.


----------



## Helmut84 (20. Feb 2008)

danke für die Antwort! Ich werde das morgen austesten und dir dann bescheid geben was sich getan hat! Mich hats nämlich gewundert woher der Thread stehen bleibt. 

was der grund ist, dass ich nicht möchte, dass Threads stehen bleiben hat folgenden grund, da ich im System einen alten Thread stehen hatte und bei jedem programmstart dieser den TAble in der DB verändert hat und nicht der neu gestartete thread!


----------



## Helmut84 (21. Feb 2008)

habe jetzt herausgefunden, dass die Datenbank-Connection trotz dem 


```
try{
       if(con != null) conDB.connClose(con);
   }catch(Exception ex){
      System.out.println(ex);
   } 
}finally{
       if(con != null) conDB.connClose(con);
}
```

es wird das con.close() also nicht wirklich ausgeführt, wird aber auch keine Exception geworfen! kennt jemand dieses Phänomen bzw. gibt es eine möglichkeit die Connection wirklich sauber zu schließen?


_L-ectron-X hat diesen Beitrag am 21.02.2008 um 16:13 Uhr editiert._
_Code-Tags eingefügt._


----------



## maki (21. Feb 2008)

Was ist denn ConectorDB?

Wette dass das Problem dort zu finden ist.


----------



## Helmut84 (21. Feb 2008)

Die Methode zum Schließen der Connection in connectorDB sieht wie folgt aus:


```
public void connClose(Connection conn)
{
    try{
        if(conn != null) {
            conn.close();
            System.out.println("Die anngegebene Connection wurde " +
                    "erfolgreich geschlossen!");
        }
    }
    catch (Exception ex){
        System.out.println("Die angegebene Connection konnte nicht " +
                "geschlossen werden!");
        System.out.println(ex);
    }
}
```


----------



## tfa (21. Feb 2008)

Interessant wäre der Konstruktor von ConnectorDB und die getConnection()-Methode.

EDIT: Und wenn du Quelltext postest, dann bitte in code-Tags.


----------



## Helmut84 (21. Feb 2008)

Der Konstruktor sieht wie folgt aus:


```
public ConnectorDB(String filepath) 
{
    rf2=new ReadFile2(filepath);
}
```

wobei die Klasse ReadFile2 nur ein File ausliest und die Informationen für die Connections bereit stellt!

die getConnection Methode sieht wie folgt aus:


```
public Connection getConnection(String vendor)
{
    Connection returnConnection=null;
    String[] connArray=rf2.getConnStringArray(vendor);
    if(connArray != null && connArray.length >= 5 && null != connArray[1] 
            && connArray[1].length() > 0 &&
            null != connArray[2] && connArray[2].length() > 0 &&
            null != connArray[3] && connArray[3].length() > 0 &&
            null != connArray[4] && connArray[4].length() > 0){        
returnConnection=connOpen(connArray[1],connArray[2],connArray[3],
                    connArray[4]);
    }
    else{
        System.out.println("Informations from the ConnStringArray " +
                "are missing!");
    }
    return returnConnection;
}

private Connection connOpen(String sDbDrv, String sDbUrl, String sUsr, 
        String sPwd)
{
    Connection conn=null;
    if(sDbDrv != null && sDbDrv.length() > 0 && sDbUrl !=null 
            && sDbUrl.length() > 0 ) {
        try{
            Class.forName(sDbDrv).newInstance();
            conn=DriverManager.getConnection(sDbUrl, sUsr, sPwd);
        }
        catch(Exception ex) {
            System.out.println(ex);
        }
    }
    return conn;
}
```


----------



## tfa (21. Feb 2008)

Da sieht man auch nicht viel. Im DriverManager könnte was passieren. 
hast du dir den Thread schonmal in einem Debugger angesehen? In der Debug-Ansicht von Eclipse werden alle laufenden Threads mit Namen aufgelistet. Durch "Suspend" kann man auch in sie hinein schauen. Vielleicht findest du so mehr Informationen.


----------



## Helmut84 (21. Feb 2008)

thx for the info! 

Hab jetzt ausprobiert -> mit con.isClosed() wird mir zwar true geliefert, wenn ich aber System.out.println(con) sage wird mir com.mysql.jdbc.Connection@194df86 geliefert...


----------



## Helmut84 (21. Feb 2008)

noch ne Anmerkung: Threads werden nur erstellt bei Connection zu mysql DB`s, nicht bei Connection zur MSSQL!


----------



## ARadauer (21. Feb 2008)

> System.out.println(con) sage wird mir com.mysql.jdbc.Connection@194df86 geliefert...


das heißt ja nicht, dass die Verbindung nicht geschlossen wurde!
Das heitß ja nur, dass es das Objekt noch gibt. Und da drin läuft noch was, aber das wird schon seinen Sinn haben.... Ich versteh das Problem nicht.. Nur weil es ein Connection Objekt gibt, heißt das nicht, dass eine Verbindung zur Datenbank besteht.


----------



## Helmut84 (21. Feb 2008)

Es gibt auch (anscheinend) keine Verbindung mehr zur DB, da ja con.isClosed() true ergibt, aber es gibt noch weitere Threads! Für jede Connection zu einer MYSQL wird ein Thread gestartet! Aber ok, ich nehm das mal so hin und überprüfe einfach ob der Threadcount > (main+Anzahl MYSQL Connections) ist


----------

