Después de muchas pruebas, hemos solucionado este problema. Es una combinación de cómo estábamos usando Spring Framework, Oracle Client y Oracle DB. Estábamos creando nuevas SimpleJDBCalls que usaban las llamadas de metadatos del cliente Oracle JDBC que se devolvían como cursores que no se cerraban ni limpiaban. Considero que esto es un error en el marco Spring JDBC en la forma en que llama a los metadatos pero luego no cierra el cursor. Spring debería copiar los metadatos del cursor y cerrarlos correctamente. No me he molestado en abrir un problema de Jira con Spring porque si utiliza las mejores prácticas, el error no se muestra.
Ajustar OPEN_CURSORS o cualquiera de los otros parámetros es la forma incorrecta de solucionar este problema y solo retrasa su aparición.
Lo solucionamos/arreglamos moviendo SimpleJDBCCall a un DAO único para que solo haya un cursor abierto para cada proceso de Oracle al que llamamos. Estos cursores están abiertos durante la vida útil de la aplicación, lo que considero un error. Siempre que OPEN_CURSORS sea mayor que la cantidad de objetos SimpleJDBCCall, no habrá problemas.