Java 7 Automatique de Gestion de la Ressource JDBC (try-with-resources déclaration)
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 gestion des ressources, le try-with-resources déclaration? (Tutoriel)
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 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é?
- Je viens juste de ne pas utiliser un auto-près dans ces situations. Comme le terme l'indique déjà c'est juste pour la fermeture de ressources. Btw: le fait de placer la connexion à l'extérieur de la
try...
bloc n'aide pas que vous ne pouvez pas rollback après le bloc try que la connexion est déjà fermé. - Double Possible de stackoverflow.com/questions/8066501/...
- Non ce n'est pas un doublon. C'est ici sur con.rollback().
Vous devez vous connecter pour publier un commentaire.
Selon la documentation 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:
En 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.
SQLException
, mais n'est pas surRuntimeException
,Error
(etc.), ce qui est un peu un problème.finally
à base de code que. La règle "tu ne capturesError
" ne pas faire de restauration, une option de fonctionnement en cas d'erreurs.Throwable
au lieu deSQLException
. Enfin c'est pas le bon endroit pour la restauration d'une transaction, le bloc finally est déclenchée si oui ou non quelque chose va mal. Vous ne voulez certainement pas de restauration lorsque le tout a fonctionné!close()
jette unSQLException
"si une base de données access erreur se produit" (selon la documentation). Dans ce cas, la transaction est en effet dans un état inconnu, et une restauration est approprié.De l'OMI, en déclarant Connexion et PreparedStatement à l'extérieur de try-catch est le meilleur moyen disponible dans ce cas.
Si vous souhaitez utiliser la connexion de pool dans la transaction, vous devez l'utiliser de cette façon:
Cet exemple de code charge de l'établissement de validation automatique des valeurs.
try (Connection conn = source.getConnection()) { conn.setAutoCommit(false); try {...; conn.commit(); } catch (SQLException ex) { conn.rollback(); throw ex;} finally { conn.setAutoCommit(true);}}