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

Chiusura di ResultSet ma non di chiusura di PreparedStatement

La perdita sarà il problema massimo del cursore aperto.

ORA-01000: maximum open cursors exceeded

Se viene superato il numero massimo di cursori aperti, il database diventerà inutilizzabile, ad eccezione dei cursori già presenti. Tuttavia, la maggior parte delle volte in cui ciò accade, i cursori trattenuti non vengono nemmeno utilizzati (come sarebbe il caso della tua domanda).

Da Java 7, il modo migliore per gestirlo è usare un try con risorse . Entrambi ResultSet e PreparedStatement implementa AutoCloseable interfaccia, il che significa che verranno chiusi quando non saranno più necessari.

Se non hai java 7, devi gestirlo in finally blocco, ma assicurati di verificare la presenza di valori nulli prima di chiudere, altrimenti potresti riscontrare un NPE se la risorsa non è mai stata inizializzata.

Nota che il contrario non causerà alcun problema poiché la chiusura di un'istruzione chiuderà automaticamente il set di risultati.

Nota che puoi facilmente consentire più cursori alla tua applicazione per meno possibilità di superare il massimo.

ALTER SYSTEM SET open_cursors = 400 SCOPE=BOTH;

Tuttavia, la maggior parte delle volte, se incontri il massimo dei cursori aperti, questa non dovrebbe essere una soluzione in quanto nasconderebbe solo il vero problema.