estou com o mesmo problema.
Eu fecho os statments e resultset e libero as conexões pro pool. O problema que reparei é que ao fechar os Statments e resultsets seria para liberar os cursores, porem os cursores só são liberados quando a conexão é fechada.
Não há a menor possibilidade de fechar as conexões, pois de que adianta fechar uma para devolve-la ao pool? o pool teria que criar outra conexao e acaba perdendo o sentido utiliza-lo. (não sei por que diabos o pool do sistema foi criado na raça!)
Reparei que nos ResultsSets tem um método que é setHoldability. Neste método eu passo a constante CLOSE_CURSORS_AT_COMMIT mas ele não fecha os cursores de maneira nenhuma.
Não sei se é alguma limitação do driver jdbc, já entrei no site da oracle e baixei o ultimo e não mudou nada.
por enquanto, pra contornar a situação eu estou utilizando uma gambi, que quando lança uma SQLException e a mensagem é de maximo de cursores eu fecho a conexao, abro outra, executo o comando novamente e devolvo a conexao ao pool, porem isso é temporario mesmo, para ter como testar o sistema até encontar uma solução.
Se encontar a solução por favor poste, estou pesquisando e farei o mesmo.
Abraço