27 votes

En JDBC, lors de la validation automatique est faux et n'explicite les points d'enregistrement ont été définis, est-il bon style ou des déchets de la restauration?

Dites que vous avez le code suivant:

Connection conn;
try
{
   conn = ... // get connection
   conn.setAutoCommit(false);

   ... // Do some modification queries and logic

   conn.commit()
} catch(SQLException e)
{
    conn.rollback() // Do we need this?
    conn.close()
}

Dans ce code, si il y a une exception, il est le meilleur style seulement de fermer la connexion (depuis autocommit est désactivé), ou explicitement de le faire reculer, puis fermer la connexion? Il n'existe pas de points de sauvegarde.

Je pense qu'il pourrait être judicieux d'ajouter de la restauration appel de la cause:

1) Quelqu'un, dans l'avenir, pourraient ajouter des points de sauvegarde, mais oubliez pas d'ajouter de la restauration

2) Il améliore la lisibilité

3) Il ne devrait pas vous coûter rien du tout, à droite ?

Mais évidemment, aucun de ces est particulièrement convaincante. Toute norme de pratique?

Note: je suis conscient de la nécessité de faire une répétition de try/catch sur la fermeture et de restauration. En fait, j'ai un middleware qui fait abstraction de la base de données access et prend soin de cela, mais je me demandais si en ajoutant qu'il était superflu.

31voto

BalusC Points 498232

La normale de l'idiome est le suivant:

Connection connection;
try {
    connection = database.getConnection();
    connection.setAutoCommit(false);

    // Fire transactional queries here.

    connection.commit()
} catch (SQLException e) {
    // Rollback throws SQLException as well.
    if (connection != null) try { connection.rollback(); } catch (SQLException logOrIgnore) {}
    throw e; // You don't want to suppress the main exception.
} finally {
    // Closing should happen in finally.
    if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
}

Wrap si nécessaire l' rollback() et close() en public static void méthode d'aide à tempérer le niveau de verbosité.

Appelant rollback() est obligatoire lorsqu'il s'agit d'un pool de connexion. Il va savoir de réinitialisation de l'affichage de l'état de la connexion. L' close() d'un pool de connexion ne le ferai pas, seulement l' commit() et rollback() va le faire. Pas d'appel rollback() peut conduire qu'à la prochaine location de la connexion du jeu sera toujours (réussie) des requêtes de la transaction précédente dans sa mémoire.

2voto

Fly Points 2218

La clôture devrait rollback car il ne va pas commettre lorsque les ressources sont de sortie, mais il est bon d'avoir votre erreur de traitement spécifique, si vous souhaitez reprendre une exception, le faire. Ensuite, vous pouvez faire votre nettoyage dans un finally{} bloc. Le rollback() se produit uniquement en cas d'erreur, dans ce cas, votre commit() n'est pas réussi ou n'a même pas été atteinte.

Connection conn = null;
try {
    conn = ...

    ...
    conn.commit();
}
catch (SQLException e) {
    if (conn != null) {
        conn.rollback();
    }
}
finally {
    if (conn != null) {
        conn.close();
    }
}

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