# Maximale Anzahl offener Cursor



## Evolver (6. Okt 2007)

Ich arbeite mit einer Oracle-DB (10) und erzeuge in meinem Programm mittelmäßig viele Datenbankeinträge (einige Dutzend bis wenige Hundert) auf einmal. Dabei bekam ich die Fehlermeldung ...
_ORA-01000: Maximale Anzahl offener Cursor überschritten_

Nun habe ich gegooglt und das einzig sinnvoll Ergebnis war, das es evtl. daran liegt, das die erzeugten ResultSets nicht schnell genug geschlossen werden. Da ich sie nicht benötige, hatte ich sie von anfang an nicht referenziert. Jetzt habe ich die folgende Änderung vorgenommen:
	
	
	
	





```
// vorher
(mDBCon.createStatement()).executeQuery(tInsertString + tValueString);
// nachher
(mDBCon.createStatement()).executeQuery(tInsertString + tValueString).close();
```

Nun werden zunächst einige mehr Einträge ausgeführt (war zumindest mein Eindruck). Dann erhalte ich aber zuerst die Fehlermeldung ...
_ORA-00604: Fehler auf rekursiver SQL-Ebene 1
ORA-01000: Maximale Anzahl offener Cursor überschritten_
... und dann immer wieder den Fehler ORA-01000 alleine.

Wo kann der Fehler liegen? Ich bin für jeden Ansatz dankbar.


----------



## Evolver (6. Okt 2007)

Könnte es etwas bringen, die ebenfalls nicht Referenzierten Statements, die bei _mDBCon.createStatement()_ zurückgegeben werden, explitzit mit _close()_ zu schließen? Da ich das an vielerlei Stellen einfügen müsste, wolle ich mich vorher mal erkundigen.
Und gäbe es dann eine Vorgabe, was zuerst geschlossen werden sollte - Statement oder ResutSet?


----------



## HoaX (6. Okt 2007)

Evolver hat gesagt.:
			
		

> Könnte es etwas bringen, die ebenfalls nicht Referenzierten Statements, die bei _mDBCon.createStatement()_ zurückgegeben werden, explitzit mit _close()_ zu schließen?


unbedingt, von alleine schließen die sich nicht...


			
				Evolver hat gesagt.:
			
		

> Und gäbe es dann eine Vorgabe, was zuerst geschlossen werden sollte - Statement oder ResutSet?



iirc sollte es reichen das statement zu schließen. aber im allgemeinen ist es immer sinnvoll in umgekehrter erstellungsreihenfolge zu schließen


----------



## Guest (7. Okt 2007)

und bei Oracle Errorcodes immer wieder nützlich: http://ora-01000.ora-code.com


----------



## Evolver (7. Okt 2007)

@HoaX:
Ich habe jetzt die Statements manuell geschlossen und siehe da, es funktioniert. Da ist wohl die Garbage-Collection zu langsam, denn wenn die Objekte richtig entsorgt werden, werden sie ja automatisch geschlossen (hab ich zumindest aus der Doc so rausgelesen).


----------



## HoaX (7. Okt 2007)

das wäre mir neu dass das der gc übernimmt. du erstellst das statement, also musst auch du das wieder schließen. das ist normales verhalten ...


----------



## Evolver (7. Okt 2007)

Im JavaDoc für Statement.close() steht:


> Releases this Statement object's database and JDBC resources immediately instead of waiting for this to happen when it is automatically closed. It is generally good practice to release resources as soon as you are finished with them to avoid tying up database resources.


Oder passiert das nu, wenn die zugehörige Connection geschlossen wird?


----------



## Guest (7. Okt 2007)

Evolver hat gesagt.:
			
		

> ...
> Oder passiert das nu, wenn die zugehörige Connection geschlossen wird?


Yep, so isses.


----------



## Evolver (8. Okt 2007)

Tja, da vermisse ich die guten C++Destruktoren .


----------



## maki (8. Okt 2007)

> Tja, da vermisse ich die guten C++Destruktoren icon_wink.gif


Das soll wohl ein Scherz sein


----------

