Maximale Anzahl offener Cursor

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
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:
Code:
// 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.
 
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?
 
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
 
@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).
 
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 ...
 
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?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben