48 votes

Statut de la connexion Java JDBC

Je me connecte (avec succès) à une base de données en utilisant la procédure suivante :

java.sql.Connection connect = DriverManager.getConnection(
  "jdbc:mysql://localhost/some_database?user=some_user&password=some_password");

Que dois-je vérifier pour voir si la connexion est toujours ouverte et opérationnelle après un certain temps ?
J'espérais quelque chose comme connect.isConnected(); que je peux utiliser.

59voto

home Points 8667

Votre meilleure chance est d'effectuer une simple requête sur une seule table, par exemple :

select 1 from SOME_TABLE;

Oh, je viens de voir qu'il y a une nouvelle méthode disponible depuis la 1.6 :

java.sql.Connection.isValid(int timeoutSeconds) :

Renvoie un message vrai si la connexion n'a pas été fermée et est toujours valide. Le pilote devra soumettre une requête sur la connexion ou utiliser un autre mécanisme qui vérifie de manière positive que la connexion est toujours valide lorsque cette méthode est appelée. La requête soumise par le pilote pour valider la connexion est exécutée dans le contexte de la transaction actuelle transaction en cours.

36voto

dty Points 11383

Rien. Exécutez juste votre requête. Si la connexion est morte, soit votre pilote JDBC se reconnectera (s'il le supporte et si vous l'avez activé dans votre chaîne de connexion - la plupart ne le supportent pas), soit vous obtiendrez une exception.

Si vous vérifiez que la connexion est établie, elle risque de s'interrompre avant que vous n'exécutiez votre requête, et vous ne gagnez donc absolument rien à vérifier.

Ceci dit, beaucoup de pools de connexion valident une connexion en faisant quelque chose comme SELECT 1 avant de distribuer les connexions. Mais cela n'est rien d'autre que l'exécution d'une requête, alors vous pourriez tout aussi bien exécuter votre requête commerciale.

16voto

Buhake Sindi Points 38654

Utilice Connection.isClosed() fonction.

En JavaDoc États :

Récupère si cette Connection a été fermé. A connexion est fermée si la méthode close a été appelée sur celle-ci ou si certaines erreurs fatales se sont produites. Cette méthode est garantie de retourner true uniquement lorsqu'elle est appelée après que la méthode Connection.close a été appelée.

12voto

Vous pouvez également utiliser

public boolean isDbConnected(Connection con) {
    try {
        return con != null && !con.isClosed();
    } catch (SQLException ignored) {}

    return false;
}

8 votes

Ce devrait être, if(con!=null || !con.isClosed()) de sorte que votre vérification porte d'abord sur l'objet, s'il est nul il ne continuera pas avec la validation de l'instruction IF. La vôtre lèvera une exception parce que con pourrait être NULL. Dans ce cas, vous n'avez pas besoin de l'ensemble du try catch.

1 votes

Ou vous pouvez simplement faire return con != null && !con.isClosed() .

4voto

Madan Sapkota Points 3464

Si vous utilisez MySQL

public static boolean isDbConnected() {
    final String CHECK_SQL_QUERY = "SELECT 1";
    boolean isConnected = false;
    try {
        final PreparedStatement statement = db.prepareStatement(CHECK_SQL_QUERY);
        isConnected = true;
    } catch (SQLException | NullPointerException e) {
        // handle SQL error here!
    }
    return isConnected;
}

Je n'ai pas testé avec d'autres bases de données. J'espère que cela vous sera utile.

0 votes

Où se trouve db proviennent-ils ?

0 votes

Voir dans la question connect variable c'est db quel que soit le nom que vous lui donnez.

0 votes

Ensuite, vous pouvez fermer votre PreparedStatement pour éviter les fuites de mémoire.

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