37 votes

Java 7 Automatic Resource Management JDBC

Comment intégrer la commune de JDBC idiome de la création et de la réception d'une connexion, l'interrogation de la base de données et éventuellement le traitement des résultats avec Java 7 automatique de la gestion des ressources?

Avant Java 7, le schéma habituel était quelque chose comme ceci:

Connection con = null;
PreparedStatement prep = null;

try{
    con = getConnection();
    prep = prep.prepareStatement("Update ...");
    ...
    con.commit();
}
catch (SQLException e){
    con.rollback(); 
    throw e;
}
finally{
    if (prep != null)
        prep.close();
    if (con != null)
        con.close();
}

Avec Java 7, vous pouvez aller pour:

try(Connection con = getConnection(); PreparedStatement prep = con.prepareConnection("Update ..."){

   ...
   con.commit();
}

Cela permet de fermer l' Connection et de la PreparedStatement, mais que dire de la restauration? Je ne peux pas ajouter une clause catch contenant de la restauration, parce que la connexion n'est disponible que dans le bloc try.

Avez-vous encore de définir la connexion en dehors du bloc try? Quelle est la meilleure pratique ici, surtout si le regroupement de connexion est utilisé?

40voto

Sean Reilly Points 9869
try(Connection con = getConnection()) {
   try (PreparedStatement prep = con.prepareConnection("Update ...")) {
       //prep.doSomething();
       //...
       //etc
       con.commit();
   } catch (SQLException e) {
       //any other actions necessary on failure
       con.rollback();
       //consider a re-throw, throwing a wrapping exception, etc
   }
}

Selon la documentation d'oracle, vous pouvez combiner un try-with-resources bloc avec un bloc try. L'OMI, l'exemple ci-dessus capture la bonne logique, qui est:

  • La tentative de fermer la PreparedStatement si rien ne se passe mal
  • Si quelque chose va mal dans le bloc interne, (peu importe qu'est-ce que c'est) annuler la transaction en cours
  • La tentative de fermer la connexion à n'importe quel
  • Si quelque chose va mal, la fermeture de la connexion, vous ne pouvez pas annuler la transaction (car c'est une méthode sur la connexion, qui est maintenant en état indéterminé), alors n'essayez pas

Dans java 6 et les versions antérieures, je voudrais faire cela avec un triplement ensemble imbriqué de blocs try (externe essayez-enfin, du moyen-try-catch, intérieure try-finally). Le BRAS de la syntaxe ne faire de cette terser.

4voto

Garbage Points 987

IMO, déclarer Connection et PreparedStatement en dehors de try-catch est le meilleur moyen disponible dans ce cas.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X