# zu viele offene Cursor, die II.



## Evolver (15. Dez 2007)

Ich hatte schon mal ein Problem mit zu vielen offenen Cursor: http://www.java-forum.org/de/viewtopic.php?t=56892&highlight=

Ich dachte, das Problem sei so gelöst, da ich keine Probleme mehr hatte, nun sind sie aber wieder da. Also ich muss haufenweise Sachen in meine Oracle-DB einfügen, und benutze immer den folgenden Code:

```
public static boolean executeSQLStatement(String pStatement, boolean pTrace)
	{
		try {
			if(mDBCon==null || mDBCon.isClosed()) return false;
			if(pTrace) System.out.println(pStatement);
			Statement tInsertionStatement = mDBCon.createStatement();
			tInsertionStatement.executeQuery(pStatement).close();
			tInsertionStatement.close();
		}	
		catch(SQLException pExc) {
			System.out.println("ERR: Fehler beim Datenbankzugriff.");
			pExc.printStackTrace();
			return false;
		}
		return true;
	}
```
Eigentlich schließe ich doch hier immer alles direkt wieder, was ich zuvor geöffnet habe. Übersehe ich hier etwas? Wo kommen die ganzen übrigen offenen Cursor her?


----------



## maki (15. Dez 2007)

Bekommst du diese Ausgabe oft?


> ERR: Fehler beim Datenbankzugriff.


Du schliest as Statemnt nur, wenn die Ausführung erfolgreich war.

Ansonsten noch ein paar Anmerkungen (diese Dinge verursachen zwar nicht dein Problem, aber trotzdem):

```
if(mDBCon==null || mDBCon.isClosed()) return false; 
..
return false; 
..
```
Eigentlich sollte hier eine Exception geworfen werden, zumindest wenn man OO Programmiert.


```
if(pTrace) System.out.println(pStatement);
```
Es gibt mehr als genug Logging Frameworks, alle davon sind einfach zu erlernen, die meisten davon sind besser als alles was du selbst schreiben kannst, zB log4j.


```
pStatement
..
pTrace
..
mDBCon
```
Das verstösst gegen die Java Code Conventions, anders gesagt: So schreibt man nicht in Java


----------



## semi (15. Dez 2007)

Verwende auch executeUpdate, nicht executeQuery, wenn du Update-Statements ausführst.
Ansonsten immer nach folgendem Schema vorgehen
	
	
	
	





```
try
{
   // Connection holen
   // Statement erzeugen
   // Update(s) ausführen
}
catch(SQLException e)
{
   // Fehler loggen und, wenn machbar, Fehlerbehandlung
   // sonst Fehler als eigene Exception mit mehr Details werfen. 
}
finally
{
   // Statement schliessen, wenn geöffnet und nicht null
   // Connection schliessen, wenn geöffnet und nicht null
}
```


----------



## Evolver (15. Dez 2007)

@maki:
Was stört dich an pStatement, pTrace und mDBCon ?

Zum Problem:
Ja es stimmt, Statements werden nur geschlossen wenn die Ausführung erfolgreich war. Das muss ich ändern. Aber in meine Test war die Ausführung vorher immer richtig (es wurdem mir kein Fehler ausgegeben, die DB-Einträge sind vorhanden), also sollte alles geschlossen worden sein.
_Edit: Ich denke ich habe den Fehler gefunden. An anderer Stelle hatte ich noch Abfragen, der Statement nicht geschlossen wurde. Muss ich nur noch teste, aber ich bin zuversichtlich._


----------

