Oracle
 sql >> Datenbank >  >> RDS >> Oracle

ORA-01000:Maximal geöffnete Cursor überschritten bei Verwendung von Spring SimpleJDBCCall

Nach vielen Tests haben wir dieses Problem behoben. Es ist eine Kombination aus der Art und Weise, wie wir das Spring-Framework und den Oracle-Client und die Oracle-DB verwendet haben. Wir erstellten neue SimpleJDBCCalls, die die Metadatenaufrufe des Oracle-JDBC-Clients verwendeten, die als Cursor zurückgegeben wurden, die nicht geschlossen und bereinigt wurden. Ich halte dies für einen Fehler im Spring JDBC-Framework, da Metadaten aufgerufen werden, der Cursor dann jedoch nicht geschlossen wird. Spring sollte die Metadaten aus dem Cursor kopieren und ordnungsgemäß schließen. Ich habe mir nicht die Mühe gemacht, ein Jira-Problem mit Spring zu öffnen, da der Fehler nicht angezeigt wird, wenn Sie Best Practices verwenden.

Das Optimieren von OPEN_CURSORS oder einem der anderen Parameter ist der falsche Weg, um dieses Problem zu beheben, und verzögert nur das Auftreten.

Wir haben es umgangen/behoben, indem wir SimpleJDBCCall in ein Singleton-DAO verschoben haben, sodass für jeden von uns aufgerufenen Oracle-Proc nur ein Cursor geöffnet ist. Diese Cursor sind für die Lebensdauer der App geöffnet - was ich als Fehler betrachte. Solange OPEN_CURSORS größer als die Anzahl der SimpleJDBCCall-Objekte ist, gibt es keine Probleme.