Le seguenti procedure dovrebbe essere fatto (in ordine)
- Il
ResultSet
- Il
PreparedStatement
- Il
Connection
.
Inoltre, è consigliabile chiudere tutti gli oggetti relativi a JDBC nello finally
nelle vicinanze per garantire la chiusura.
//Do the following when dealing with JDBC. This is how I've implemented my JDBC transactions through DAO....
Connection conn = null;
PreparedStatement ps = null;
ResultSet rs = null;
try {
conn = ....
ps = conn.prepareStatement(...);
//Populate PreparedStatement
rs = ps.executeQuery();
} catch (/*All relevant exceptions such as SQLException*/Exception e) {
logger.error("Damn, stupid exception: " , e);
} finally {
if (rs != null) {
try {
rs.close();
rs = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
if (ps != null) {
try {
ps.close();
ps = null;
} catch (SQLException e) {
logger.error(e.getMessage(), e.fillInStackTrace());
}
}
try {
if (conn!= null && !conn.isClosed()){
if (!conn.getAutoCommit()) {
conn.commit();
conn.setAutoCommit(true);
}
conn.close();
conn= null;
}
} catch (SQLException sqle) {
logger.error(sqle.getMessage(), sqle.fillInStackTrace());
}
}
Potete vedere che ho controllato se i miei oggetti sono nulli e per il collegamento, controllare prima se la connessione non è autocommited. Molte persone non riescono a controllarlo e si rendono conto che la transazione non è stata impegnata in DB.
fonte
2010-03-02 14:40:40
Dove l'hai visto? – BalusC
Anche se, secondo le specifiche, la dichiarazione deve essere chiusa quando la connessione è chiusa, i driver JDBC hanno riscontrato problemi con questo, quindi è considerato una buona pratica chiudere esplicitamente l'istruzione (e il set di risultati). – Yishai
Chiudere le cose nell'ordine inverso in cui le hai aperte. Tutte le cose. – EJP