DB-Connection schliessen und trotzdem ResultSet zurückgeben
dave
- java
0 King^Lully0 dave0 King^Lully0 dave0 King^Lully0 King^Lully0 dave
0 Slyh
Hallo liebes Forum,
meine Frage behandelt zwar Java, aber ich hoffe ihr könnt mir trotzdem weiterhelfen.
Also ich habe eine Methode, die das DB-ResultSet zurückgeben soll, und nach der Anfrage die Verbindung schliessen soll.
//Code:
public ResultSet getDBData(String query){
ResultSet rs_tmp;
Connection cn = this.getConnection();
try{
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(query);
rs.close();
st.close();
cn.close();
return rs;
} catch (SQLException e){
error = true;
errorMsg = e.getMessage();
}
}
Leider meldet der Compiler, dass eine Rückgabe von "rs" nach dem schliessen nicht mehr möglich ist.
Meine Frage daher: Wie ist es möglich das ResultSet zurückzugeben und die DB-Connection zu schliessen?
vielen Dank für eure Hilfe....
Leider meldet der Compiler, dass eine Rückgabe von "rs" nach dem schliessen nicht mehr möglich ist.
Meine Frage daher: Wie ist es möglich das ResultSet zurückzugeben und die DB-Connection zu schliessen?
Die Reihenfolge der Anweisungen ändern? ;)
Hallo King^Lully,
vielen Dank für deine Antwort.
Leider habe ich mit
Die Reihenfolge der Anweisungen ändern? ;)
nicht sehr viel angefangen. Kannst du dies bitte näher erläutern?
grüße
dave
Mach mal
return rs;
bevor Du die Objekte closed.
Mach mal
return rs;
bevor Du die Objekte closed.
naja, da wird die Connection nicht wieder geschlossen :-(
Mach mal
return rs;
bevor Du die Objekte closed.naja, da wird die Connection nicht wieder geschlossen :-(
Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)
Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)
Hab jetzt doch mal einen näheren Blick auf den Code geworfen, was geht denn da genau ab? Mal erläutern...
also:
Die Ganze Klasse ist als Singleton angelegt.
getConnection() lädt den JDBC-Treiber und stellt eine Verbindung zur DB her.
//kommentierter Code:
public ResultSet getDBData(String query){
//Verbindung aufbauen
Connection cn = this.getConnection();
try{
//Die normalen DB-Methoden
Statement st = cn.createStatement();
//query ist SQL-Anfrage
ResultSet rs = st.executeQuery(query);
//Schliessen
rs.close();
st.close();
cn.close();
//Hier sollte das ResultSet übergeben werden, um nachher einen HTML-Table zu erzeugen
return rs;
} catch (SQLException e){
//Fehlerbehandlung
error = true;
errorMsg = e.getMessage();
}
}
Ich kenne mich mit Java nicht aus, aber ein paar Anmerkungen:
Die Ganze Klasse ist als Singleton angelegt.
Ein Singleton ist eine einelementige Menge, vermute mal, dass das eine Klasse ist, die nur einmalig instaziiert werden kann, korrekt?
public ResultSet getDBData(String query){
//Verbindung aufbauen
Connection cn = this.getConnection();
Greifst Du auf eine bestehende Verbindung zurück, wo ist der Connection-String?
try{
//Die normalen DB-Methoden
Statement st = cn.createStatement();
//query ist SQL-Anfrage
ResultSet rs = st.executeQuery(query);
So, jetzt hast Du die Datensatzmenge.
//Schliessen
rs.close();
st.close();
cn.close();
//Hier sollte das ResultSet übergeben werden, um nachher einen HTML-Table zu erzeugen
return rs;
Jetzt gibst Du zu spät das rs zurück, denn dieses ist ja gerade geschlossen worden.
} catch (SQLException e){
//Fehlerbehandlung
error = true;
errorMsg = e.getMessage();
}
}
Wird die Fehlermeldung zurückgegeben?
danke für deine Bemühungen.
Sofern die Connection beendet wird, ist auch das ResultSet weg.
Daher muss man vorher etwas "überstülpen" wie zB ein RowSet.
//Code (sollte jemand vor einem ähnlichen Problem stehen):
...
import com.sun.rowset.CachedRowSetImpl;
...
public CachedRowSetImpl getDBRowSet(String query){
CachedRowSetImpl rset;
Connection cn = this.getConnection();
try{
rset = new CachedRowSetImpl();
Statement st = cn.createStatement();
ResultSet rs = st.executeQuery(query);
rset.populate(rs);
rs.close();
st.close();
cn.close();
return rset;
} catch (SQLException e){
e.printStackTrace();
}
return null;
}
Was passiert denn, wenn Du das Resultset-Objekt zurückgibst und gar kein Objekt schliesst? (JAVA/JSP wird schon das Schliessen irgendwie im Hintergrund besorgen.)
Das würde gehen, darf ich aber nicht. Steht eindeutig in der Angabe.
Ich denke ich muss dies mit einem Array oder ähnlichem lösen. RowSet?
Hallo,
Die Reihenfolge der Anweisungen ändern? ;)
Dieter Nuhr!
Gruß
Slyh
Die Reihenfolge der Anweisungen ändern? ;)
Dieter Nuhr!
Häh, der Kabarettist? Verstehe ich nicht.
Aber Dir ist schon aufgefallen, dass die Objekte geschlossen werden bevor das RecordSet zurückgegeben wurde?