# Code-Design Frage, jdbc und ResultSet



## DarthShader (29. April 2007)

Hallo,

ich habe gerade ein kleines Code-Design Problem, bei dem ich gerne einmal Eure Meinung hören würde. Es geht um eine Datenbank Abfrage per jdbc und der Datenbank HSQLDB.

Ich habe eine Methode, in der ich die Abfrage (SQL Query) ausführe. Bekannterweise erhält man als Ergebnis ein ResultSet, in dem die Datensätze enthalten sind.

Nun sieht das folgendermaßen aus:


```
try {
	con = DriverManager.getConnection( "jdbc:hsqldb:hsql://localhost/test", "sa", "" );
	Statement s = con.createStatement();
	rs = s.executeQuery( query );

	// ResultSet auswerten...
	
	rs.close();
	s.close();
}
catch ( SQLException e ) {
	e.printStackTrace();
}
finally {
	if ( con != null )
		try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); };
}
```

Dort wo der Kommentar "// ResultSet auswerten..." steht, sollten die Daten aus dem ResultSet verarbeitet werden. Ich möchte jedoch das ResultSet als Rückgabewert der Methode haben, sprich irgendwo unten steht dann "return rs;".

Aber: wenn das ResultSet geschlossen wird ( rs.close() ), kann ich nicht mehr viel damit anfangen. Aber wenn ich es zurückliefere, wird es ja automatisch geschlossen, da ich den finally Block habe. Und sollte man ein ResultSet nicht auch vernünftigerweise schließen?

Also ist es schlecht, als Rückgabetyp der Methode ein ResultSet zu haben, damit die Auswertung der Daten an einer anderen Stelle geschehen kann? Sollte ich einen eigenen Ergebnistyp (2-dim Array) erstellen, in den ich die Datensätze aus dem ResultSet hineinkopiere und diesen dann zurückliefere? Oder ist es in Ordnung, das ResultSet nicht zu schließen und einfach zurückzuliefern?


Vielen Dank für Eure Hilfe


----------



## gring0 (30. April 2007)

Hi DarthShader,

wenn du das resultset unbedingt zurückgeben willst muss sich der Aufrufer eben auch um das Schließen kümmern.

Gruß,
gring0


----------



## DarthShader (1. Mai 2007)

gring0 hat gesagt.:


> wenn du das resultset unbedingt zurückgeben willst muss sich der Aufrufer eben auch um das Schließen kümmern.



Ich wills ja nicht _unbedingt_ zurückgeben. Meine Frage geht halt eher dahin, ob es eine gute Methodik ist, oder ob es bessere Lösungswege gibt (z.B. die Zeilen des ResultSets in ein 2dim Array kopieren und dieses zurückgeben, damit das ResultSet ordentlich geschlossen werden kann).


----------



## gora (1. Mai 2007)

Hallo Darth.
Ich habe auf der Arbeit als Softwareentwickler sehr viel mit Datenbanken zu tun.
ich würde das ganze ein wenig anders Gliedern.

Wenn du das Programm startest, öffne die Verbindung zur Datenbank. 
Schließe diese Verbindung erst wenn das Programm beendet wird.

Wenn du bei jedem Statement, dass du auf die Datenbank sendest die Verbindung  erst wieder aufbaust und anschließend wieder schließt kostet das einfach viel zu viel Zeit. Ist also nicht wirklich performant.

Schreibe den Inhalt des Resultsets doch einfach in eine Objektvariable, die du dann mit ein Getter-Methode ansprichst. Dann kannst du das Resultset, dass das execQuery() zurückgibt einfach schließen.  

Meine Datenbankobjekte sehen ca. immer so aus.

1. openConnection()

2. doStatement(Statement query)

3. closeConnection()

Das Auswerten des Resultsets findet im Programm statt, nicht in der Datenbankklasse.  

Ich hoffe dir hiermit ein paar Ansätze geliefert zu haben, die dir beim Design weiterhelfen.

Gruß 

Gora


----------



## DarthShader (1. Mai 2007)

Hallo,

danke für Deine Hilfe



gora hat gesagt.:


> Wenn du das Programm startest, öffne die Verbindung zur Datenbank.
> Schließe diese Verbindung erst wenn das Programm beendet wird.


 
ja, das werde ich auch so machen, bisher war mein Vorgehen nur zu testzwecken so.



gora hat gesagt.:


> Schreibe den Inhalt des Resultsets doch einfach in eine Objektvariable, die du dann mit ein Getter-Methode ansprichst. Dann kannst du das Resultset, dass das execQuery() zurückgibt einfach schließen.



Da würde ich gerne nochmal nachhaken: wann genau kann ich das Resultset dann schließen? Meinst Du mit "Inhalt des Resultsets", dass ich per while schleife durch die Rows des ResultSets gehe, und dabei z.B. ein 2dim-Array schreibe, das dann wiederum eine Objektvariable ist, sodass ich dieses dann per Getter Methode hole?
Dann könnte ich ja auch gleich dieses 2dim-Array zurückgeben...


----------

