MySQL ResultSet zurückgeben nachdem Connection geschlossen wurde?

tehK

Mitglied
Hallo zusammen,

Ich bin gerade auf ein Problem gestoßen, bei dem ich keine richtig befriedigende Antwort finden konnte.

Es geht darum, Datenbankabfragen in einer Handler-Klasse zu zentralisieren, die sich dann auch um das Öffnen und Schließen der Connections kümmern soll. Leider wird dann auch das ResultSet geschlossen, das ich eigentlich zurückgeben wollte.

Die Funktion im Handler sieht ungefähr so aus:
Java:
protected ResultSet genericSelect(String sql) {
		ResultSet rs = null;
		Connection conn = null;
		PreparedStatement ps = null;
		
		try {		
			conn = getConnection(); 
			ps = conn.prepareStatement(sql);		
			
			rs = ps.executeQuery();
			
		} catch (Exception e) {
                        // Exception handling
			
		} finally {
			close(ps, conn);
		}

		return rs;
}

Die aufrufende Funktion kann jetzt nicht mit dem ResultSet arbeiten. Als Fehler erhält man da:
java.sql.SQLException: Operation not allowed after ResultSet closed

Ich sehe jetzt nur 2 Möglichkeiten:
  • Die aufrufende Funktion muss sich um das Schließen der Connection kümmern
  • Ich darf kein ResultSet zurückgeben

Die erste Lösung finde ich unschön und bei der zweiten Lösung weiß ich nicht, was ich sonst zurückgeben sollte. Die Methode soll ja generisch bleiben und gar nicht wissen, welche Daten sie holt.


Vielleicht fällt ja hier jemand eine andere, bessere Lösung ein ;)
Wie gesagt: Dass sich die aufrufende Funktion um das Schließen der Connection kümmert, wäre ja kein Problem - ich find's nur unschön und wollte das eigentlich in diesen generischen Funktionen mit kapseln.


Beste Grüße,

/tehK
 

tfa

Top Contributor
Du solltest das gesamte ResultSet einlesen und die Objekte in eine Collection packen. Damit kannst du dann machen, was du willst - auch wenn die Connection geschlossen wurde.
Das völlig generisch zu machen könnte aufwendig werden. Ich empfehle, für jede Fachklasse eine eigene DB-Zugriffsklasse zu entwickeln (Stichwort DAO).
 
S

SlaterB

Gast
statt ResultSet gibst du ein Objekt XResultSet zurück, darin hast du vor Ende der Methode alle Daten kopiert,
wie diese neue Klasse intern aufgebaut ist kannst du dir aussuchen, Object[][], Liste, neue Enum für die Datentypen,
kann man so kompliziert machen wie man möchte

du könntest auch ein Objekt einer neuen Klasse zurückgeben, welches das Original-ResultSet + Connection usw. enthält
und der Aufrufer muss am Ende nur ein simples close() der neuen Klasse aufrufen, darin wird versteckt die Connection geschlossen mit try/catch usw.,
dann muss der Aufrufer diese Details nicht kennen, obwohl er sowieso direkt mit JDBC verknüpft ist, wenn er mit dem ResultSet arbeiten soll
 

tehK

Mitglied
Danke euch schon mal für die schnellen Antworten!

Du solltest das gesamte ResultSet einlesen und die Objekte in eine Collection packen. Damit kannst du dann machen, was du willst - auch wenn die Connection geschlossen wurde.
Das völlig generisch zu machen könnte aufwendig werden. Ich empfehle, für jede Fachklasse eine eigene DB-Zugriffsklasse zu entwickeln (Stichwort DAO).

Die Frage ist dabei das "wie", also: Wie packe ich die Objekte in eine Collection, wenn die Methode nicht weiß / wissen soll, welche Daten sie eigentlich holt? Ich schätze, der Satz "Das völlig generisch zu machen könnte aufwendig werden" sagt alles ;)

Eine Art DAO-Schicht ist schon vorhanden. Die ist aber so angelegt, dass dort nur "abstraktere" Methoden liegen, die das SQL-Statement zusammenbauen und dann aus dem ResultSet das entsprechende Objekt erzeugen sollten. Diese Methoden sollten auf den eigentlichen DB-Handler zugreifen können, der sich dann um die eigentlichen Connections kümmern sollte - also Connection aus einem Connection Pool holen, SQL Statement ausführen, ResultSet zurückgeben, Connection schließen.

An dem vielen "sollte" sieht man, dass ich völlig übersehen hatte, dass man eben nicht auf dem ResultSet arbeiten kann, wenn die Connection weg ist. kopf->tisch


statt ResultSet gibst du ein Objekt XResultSet zurück, darin hast du vor Ende der Methode alle Daten kopiert,
wie diese neue Klasse intern aufgebaut ist kannst du dir aussuchen, Object[][], Liste, neue Enum für die Datentypen,
kann man so kompliziert machen wie man möchte
Das wär natürlich eine Idee, könnte aber aufwendig werden (und wir haben doch keine Zeit!) und hat vermutlich auch das Problem, dass ich nicht weiß, welche Daten ich erhalte und dann erst wieder vom Object auf einen int-value kommen muss oder sowas. Ich fürchte, das schöne Handling des ResultSets geht dann verloren.

du könntest auch ein Objekt einer neuen Klasse zurückgeben, welches das Original-ResultSet + Connection usw. enthält
und der Aufrufer muss am Ende nur ein simples close() der neuen Klasse aufrufen, darin wird versteckt die Connection geschlossen mit try/catch usw.,
dann muss der Aufrufer diese Details nicht kennen, obwohl er sowieso direkt mit JDBC verknüpft ist, wenn er mit dem ResultSet arbeiten soll

Ich nehme an, so ähnlich werd ich's machen (müssen). Es ist zwar imho etwas schade, dass der Aufrufer nochmal extra ein "close" machen muss, aber soweit ich das sehe, ist das doch die einfachste Lösung.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S ResultSet als Parameter an andere Klasse übergeben Datenbankprogrammierung 3
Z ResultSet ist null warum? Datenbankprogrammierung 12
R HSQLDB ResultSet update aktualisiert DB, aber nicht das ResultSet Datenbankprogrammierung 2
Dimax Erstellen ResultSet und Statement Datenbankprogrammierung 30
C PostgreSQL ResultSet.TYPE_SCROLL_SENSITIVE setzen Datenbankprogrammierung 2
L MySQL Bekomme einen Fehler beim ResultSet Datenbankprogrammierung 12
L Zugriff auf ein Resultset Datenbankprogrammierung 7
L MySQL ResultSet vollständig auslesen Datenbankprogrammierung 20
D Resultset schließen ?? Datenbankprogrammierung 5
T Oracle Resultset to Array sehr langsam. Datenbankprogrammierung 8
B Probleme mit java.sql.SQLException: ResultSet closed Datenbankprogrammierung 21
J SQLite ResultSet closed -- Wiederholende DB-Abfragen Datenbankprogrammierung 6
Z MySQL Probleme mit resultSet executQuery Datenbankprogrammierung 3
L ResultSet Datenbankprogrammierung 1
J wie mit resultset.next() über Datensätze iterieren? Datenbankprogrammierung 15
R MySQL Umgang mit ResultSet/Fremdschlüssel ausgeben Datenbankprogrammierung 2
D MySQL ResultSet als Stream weiter geben Datenbankprogrammierung 9
M ResultSet Cachen Datenbankprogrammierung 3
R ResultSet mit "Untertabellen" Datenbankprogrammierung 4
N SQL-Statement Auslesen des Resultset wird immer langsamer Datenbankprogrammierung 6
R Resultset.last() Problem Datenbankprogrammierung 12
PaulG Leeres ResultSet initialisieren Datenbankprogrammierung 6
J Frage zu ResultSet Datenbankprogrammierung 3
J SQL ResultSet Previous Datenbankprogrammierung 10
S MySQL ResultSet in ein Array übertragen Datenbankprogrammierung 7
H PostgreSQL Objekte aus ResultSet Datenbankprogrammierung 5
H ResultSet is closed tritt bei JSF aber nicht bei einer Java-Applikation auf Datenbankprogrammierung 10
O Oracle Resultset greift auf Spaltenüberschriften zu Datenbankprogrammierung 2
Kenan89 Wieso klappt das ResultSet nicht? Datenbankprogrammierung 3
C ResultSet enthält nicht alle Daten Datenbankprogrammierung 4
F Derby/JavaDB Resultset in JTablemodel Datenbankprogrammierung 2
F Oracle ResultSet zu einer HashMap<Integer, String[]> Datenbankprogrammierung 6
B SQLite ResultSet is TYPE_FORWARD_ONLY Datenbankprogrammierung 5
T Exception ResultSet Datenbankprogrammierung 7
0 ResultSet in JTable Datenbankprogrammierung 14
S [SQL] ResultSet Datenbankprogrammierung 4
R ResultSet Datenbankprogrammierung 4
I Sonderbehandlung wenn ResultSet leer ist Datenbankprogrammierung 9
I Problem mit ResultSet Datenbankprogrammierung 2
I SQL_Abfrage-Ergebnis (ResultSet) in String[] speichern Datenbankprogrammierung 29
B ResultSet wirft komische NullPointerException. Datenbankprogrammierung 3
R Detached ResultSet Datenbankprogrammierung 3
F generelle Vorgehensweise ResultSet Datenbankprogrammierung 5
S ResultSet Datenbankprogrammierung 2
A MySQL ResultSet.updateBytes schlägt fehl Datenbankprogrammierung 2
F ResultSet kann Datenbank nicht update, warum? Datenbankprogrammierung 3
T ResultSet befehl für leere Spalte nicht lesen Datenbankprogrammierung 4
S ResultSet einer Datenbankabfrage - Nullpointer Exception Datenbankprogrammierung 13
A PostgreSQL anfängerfrage: resultset zeilenweise auslesen Datenbankprogrammierung 2
K Keine ResultSet bei if in StoredProcedure Datenbankprogrammierung 16
D ResultSet gibt nichts aus. Datenbankprogrammierung 3
trash ResultSet Syntax Fehler Datenbankprogrammierung 11
ARadauer JDBC ResultSet schließen? Datenbankprogrammierung 4
M Oracle Problem mit Resultset Datenbankprogrammierung 11
J jdbc ResultSet types Datenbankprogrammierung 5
R Frage zu PreparedStatement/ResultSet Datenbankprogrammierung 16
F ResultSet to String[] Datenbankprogrammierung 3
E ResultSet in HashMap Datenbankprogrammierung 8
K Tabelle mit resultset refreshen? Datenbankprogrammierung 4
M Problem mit ResultSet bei SQL Server 2005 Datenbankprogrammierung 6
S ResultSet in ArrayList ablegen Datenbankprogrammierung 17
G Daten aus ResultSet in String-Liste Datenbankprogrammierung 13
T ResultSet initialisieren Datenbankprogrammierung 2
C kein Resultset Datenbankprogrammierung 2
G ResultSet: String mit Anführungszeichen einlesen Datenbankprogrammierung 8
T ResultSet-Inhalt in Arrays schreiben Datenbankprogrammierung 3
S ResultSet variabel auslesen Datenbankprogrammierung 4
D Anzahl der Elemente im ResultSet ermitteln Datenbankprogrammierung 8
A Leeres ResultSet mit H2 unter Vista Datenbankprogrammierung 3
A Warum ist mein ResultSet leer? Datenbankprogrammierung 5
S ResultSet closed Datenbankprogrammierung 2
Z ResultSet mit einer anderen Datenquelle Datenbankprogrammierung 7
O Spaltenname aus Resultset Datenbankprogrammierung 2
thE_29 ResultSet und doppelte Spalten Datenbankprogrammierung 4
E Neues select auf ein vorhandenes Resultset Datenbankprogrammierung 11
E ResultSet vergisst Reihe? Datenbankprogrammierung 2
N resultset aus andere klasse übergeben Datenbankprogrammierung 3
F ResultSet refresh moeglich? Datenbankprogrammierung 3
S ResultSet enthält keine Daten Datenbankprogrammierung 2
B Geschlossenes ResultSet Datenbankprogrammierung 6
T ResultSet#next Ungültige Reihenfolge (DB2) Datenbankprogrammierung 5
T ResultSet schließen? Datenbankprogrammierung 6
S Tabelle updaten wenn ResultSet aus JDBC-Quelle Datenbankprogrammierung 2
S ResultSet Datenbankprogrammierung 6
F Filtern innerhalb eines Resultset Datenbankprogrammierung 12
S Connection/Statement/ResultSet auf einmal geschlossen Datenbankprogrammierung 8
@ Like-Klausel; NPE bzw. leeres ResultSet Datenbankprogrammierung 4
C Resultset nach connection close weiterreichen Datenbankprogrammierung 5
B No ResultSet was produced Datenbankprogrammierung 2
S ResultSet erweitern ? Datenbankprogrammierung 4
E JDBC, ForwardOnly bei ResultSet nach Uebergabe Datenbankprogrammierung 4
R ResultSet liefert oracle.sql.TIMESTAMP, aber unbrauchbar Datenbankprogrammierung 9
A Probleme mit ResultSet und getString(i) Datenbankprogrammierung 13
RaoulDuke ResultSet - Wie arbeitet sowas intern Datenbankprogrammierung 2
N Probleme mit "nur vorwärts gerichtete ResultSet" Datenbankprogrammierung 7
G Für jede SQL-Abfrage eigenes Statement und ResultSet? Datenbankprogrammierung 3
T MAX und ResultSet#next Datenbankprogrammierung 10
R ResultSet zu bestimmtem DS navigieren Datenbankprogrammierung 4
S .leeres Resultset abfangen Datenbankprogrammierung 2
B ResultSet ohne Datenbank erstellen Datenbankprogrammierung 4

Ähnliche Java Themen

Neue Themen


Oben