Threads bei DBConnection

Status
Nicht offen für weitere Antworten.

Helmut84

Mitglied
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!!!!
 

Helmut84

Mitglied
Code:
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

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

Helmut84

Mitglied
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

Top Contributor
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

Code:
		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

Mitglied
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

Mitglied
habe jetzt herausgefunden, dass die Datenbank-Connection trotz dem

Code:
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.
 
M

maki

Gast
Was ist denn ConectorDB?

Wette dass das Problem dort zu finden ist.
 

Helmut84

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

Code:
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

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

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

Helmut84

Mitglied
Der Konstruktor sieht wie folgt aus:

Code:
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:

Code:
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

Top Contributor
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

Mitglied
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...
 

ARadauer

Top Contributor
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

Mitglied
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
 
Status
Nicht offen für weitere Antworten.

Oben