J'ai fait une revue de code (en utilisant principalement des outils comme FindBugs) d'un de nos projets favoris et FindBugs a marqué le code suivant comme erroné (pseudocode) :
Connection conn = dataSource.getConnection();
try{
PreparedStatement stmt = conn.prepareStatement();
//initialize the statement
stmt.execute();
ResultSet rs = stmt.getResultSet();
//get data
}finally{
conn.close();
}
L'erreur était que ce code pouvait ne pas libérer de ressources. Je me suis rendu compte que le ResultSet et le Statement n'étaient pas fermés, alors je les ai fermés dans finally :
finally{
try{
rs.close()
}catch(SqlException se){
//log it
}
try{
stmt.close();
}catch(SqlException se){
//log it
}
conn.close();
}
Mais j'ai rencontré le modèle ci-dessus dans de nombreux projets (de plusieurs entreprises), et personne ne fermait les ResultSets ou les Statements.
Avez-vous eu des problèmes avec les ResultSets et les Statements qui ne sont pas fermés lorsque la connexion est fermée ?
J'ai trouvé seulement ce et il fait référence au fait qu'Oracle a des problèmes avec la fermeture des ResultSets lors de la fermeture des Connexions (nous utilisons une base de données Oracle, d'où mes corrections). java.sql.api ne dit rien dans la javadoc Connection.close().
0 votes
Je recommande vivement d'utiliser Apache commons-dbutils ( commons.apache.org/dbutils ) Il s'agit d'une bibliothèque JDBC légère qui nettoie vraiment beaucoup de code JDBC passe-partout.
2 votes
C'est le genre d'erreurs que l'on obtient lorsqu'on ne ferme pas les objets concernés - "ORA-01000 : le nombre maximum de curseurs ouverts est dépassé". stackoverflow.com/questions/12192592/
0 votes
Curseur de base de données - stackoverflow.com/questions/3861558/ Un curseur est un outil qui vous permet d'itérer les enregistrements d'un ensemble. Il possède les concepts d'ordre et d'enregistrement courant.