Oracle
 sql >> Database >  >> RDS >> Oracle

ORA-01000:numero massimo di cursori aperti superato quando si utilizza Spring SimpleJDBCCall

Dopo molti test abbiamo risolto questo problema. È una combinazione di come stavamo usando il framework di primavera e il client Oracle e Oracle DB. Stavamo creando nuovi SimpleJDBCCalls che utilizzavano le chiamate ai metadati del client Oracle JDBC che venivano restituite come cursori che non venivano chiusi e ripuliti. Considero questo un bug nel framework Spring JDBC nel modo in cui chiama i metadati ma poi non chiude il cursore. Spring dovrebbe copiare i metadati dal cursore e chiuderlo correttamente. Non mi sono preoccupato di aprire un problema di jira con la primavera perché se usi le migliori pratiche il bug non viene visualizzato.

Modificare OPEN_CURSORS o uno qualsiasi degli altri parametri è il modo sbagliato per risolvere questo problema e ritarda solo la sua comparsa.

Abbiamo risolto il problema spostando SimpleJDBCCall in un DAO singleton in modo che ci sia un solo cursore aperto per ogni proc Oracle che chiamiamo. Questi cursori sono aperti per tutta la vita dell'app, cosa che considero un bug. Finché OPEN_CURSORS è maggiore del numero di oggetti SimpleJDBCCall, non ci saranno problemi.