una connessione al database è di proprietà e gestito dal database, la classe dà solo accedi a quella risorsa del database. Se non si chiude la connessione, la classe Java potrebbe essere eliminata dal garbage collector, ma il database potrebbe non essere in grado di dire che la connessione non è più in uso e che le risorse del database potrebbero essere sprecate (fino al timeout sul lato del database) o persino perdite.
Così, quando hai finito con l'utilizzo di tuo Connection
, si dovrebbe essere sicuri di chiudere in modo esplicito chiamando il suo metodo close()
. Ciò consentirà al garbage collector di ricordare la memoria il prima possibile e, più importante, di rilasciare qualsiasi altra risorsa del database (cursori, maniglie, ecc.) Sulla quale la connessione potrebbe trattenere.
Il modo tradizionale di fare questo in Java è quello di chiudere il ResultSet
, Statement
, e Connection
(in quest'ordine) in un blocco finally
quando si è fatto con loro e il modello di sicurezza sembra che:
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
// Do stuff
...
} catch (SQLException ex) {
// Exception handling stuff
...
} finally {
if (rs != null) {
try {
rs.close();
} catch (SQLException e) { /* ignored */}
}
if (ps != null) {
try {
ps.close();
} catch (SQLException e) { /* ignored */}
}
if (conn != null) {
try {
conn.close();
} catch (SQLException e) { /* ignored */}
}
}
il blocco finally
può essere leggermente migliorata in (per evitare il controllo nullo):
} finally {
try { rs.close(); } catch (Exception e) { /* ignored */ }
try { ps.close(); } catch (Exception e) { /* ignored */ }
try { conn.close(); } catch (Exception e) { /* ignored */ }
}
Ma, ancora, questo è estremamente dettagliato in modo generalmente finisce per utilizzare una classe di supporto per chiudere gli oggetti in metodi di supporto nulli di sicurezza e il blocco finally
diventa qualcosa di simile:
} finally {
DbUtil.closeQuietly(rs);
DbUtil.closeQuietly(ps);
DbUtil.closeQuietly(conn);
}
E, in realtà, il Apache Commons DbUtils ha una classe DbUtils
che sta appunto facendo che quindi non c'è bisogno di scrivi il tuo.
Nel vostro caso, questo risolverà il problema dell'eccezione, ma non quello di debug (e si sprecheranno le risorse del database fino a quando non si verificherà il timeout sul lato del database). Quindi 1. non eseguire il debug del codice utilizzando un database di produzione 2. prova ad eseguire la sessione di debug fino alla fine.
I ragazzi di Sun erano INSANE quando decisero di non avere distruttori. Era molto più facile chiudere qualsiasi risorsa aperta in distruttori come in C++. Ora, guarda tutto ciò che è necessario scrivere per una piccola query di database ... Dovrebbe essere stato fatto in 3 righe di codice: connettersi a db, eseguire query, ottenere risultati. –