Kleine Frage zu java.sql.Statement

jeipack

Erfahrenes Mitglied
Hi

Was passiert wenn bei einem Statement close() nicht aufgerufen wurde?

Hier ein kleiner Beispielcode: (Fall 1 und 2 führen zum selben Ergebnis, aber bei 1 wird close() nicht aufgerufen).
Java:
Connection c = getConnection();

//Fall 1:
c.createStatement().execute("CALL something();");
//Fall 2:
Statement s = c.createStatement();
s.execute("CALL something();");
s.close();
 
Mh also so gut kenne ich die sql-Klassen von java nun nicht um das genau zu beantworten. Ich kann eigentlich nur raten:

Ich denke mal ein Connection-Objekt beinhaltet nur die Verbindungsdaten und öffnet keine Verbindung. Mit einem createStatement bekommt man dann eine neue Verbindung auf die man ein oder mehrere Queries absetzen kann. Danach sollte man die Verbindung schließen.

Falls man die Verbindung nicht schließt wird sie automatisch nach einem Timeout (oder vom Destruktor in Java) geschlossen. Sicher bin ich mir da aber wie gesagt nicht...

lg
 
ähm.. doch das Connection muss eine Verbindung haben, denn sowas funktioniert z.B:
Java:
c.createStatement().execute("USER my_db;");
c..createStatement().execute("CREATE TABLE blah blah blah;");
Die Tabelle blah ist dann in der Datenbank my_db, somit muss die Verbindung vom Connection Objekt offen gehalten werden.
 
Falls man die Verbindung nicht schließt wird sie automatisch nach einem Timeout (oder vom Destruktor in Java) geschlossen.
lg

es gibt in java keine destruktoren. das hat auch einen bestimmten grund.. wenn es welche gaebe, wuerden die einem kaum was nutzen, da kein mensch weiss ob sie jemals aufgerufen werden. der garbage collector raeumt auf, aber wann und ob ueberhaupt entscheidet nicht der programmierer.
destruktoren gibt es zb in c++, aber da muss sich auch der programmierer selber um die speicherfreigabe kuemmern..
 
es gibt in java keine destruktoren. das hat auch einen bestimmten grund.. wenn es welche gaebe, wuerden die einem kaum was nutzen, da kein mensch weiss ob sie jemals aufgerufen werden. der garbage collector raeumt auf, aber wann und ob ueberhaupt entscheidet nicht der programmierer.
destruktoren gibt es zb in c++, aber da muss sich auch der programmierer selber um die speicherfreigabe kuemmern..

Gut, du magst soweit recht haben das es keine direkten Destruktoren in dem Sinne gibt. Zumindest nich für den selben Zweck den sie in c++ erfüllen. Dennoch gibt es finalize Methoden welche der GC vor dem vernichten des Objekts aufruft, gut? :)

Code:
  protected void finalize()
  {
  }
 
In die Doku hätte ich auch selbst reinschauen können *selbsttadel*..
Allerdings beantwortet es meine eigentliche Frage leider nicht. Solange noch ein ResultSet offen ist, ist mir klar dass man ein close() aufrufen muss. Wenn das Statement aber keine offenen RS mehr hat frage ich mich was denn da noch ge'close()'d werden soll..?

Resp. bei meinem Beispiel gibt es ja gar kein ResultSet..


Mal schauen, vielleicht weiss ja noch jemand was :D

Grüsse
 
Zurück