web-dev-qa-db-fra.com

Java État de connexion JDBC

Je me connecte (avec succès) à une base de données à l'aide des éléments suivants:

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 active après un certain temps?
J'espérais que quelque chose comme connect.isConnected(); serait disponible pour moi.

37
MonoThreaded

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

Si vous vérifiez que la connexion est établie, elle risque de tomber avant d'exécuter réellement votre requête, de sorte que vous ne gagnez absolument rien en vérifiant.

Cela dit, de nombreux pools de connexions valident une connexion en faisant quelque chose comme SELECT 1 avant de distribuer les connexions. Mais ce n'est rien de plus que l'exécution d'une requête, vous pouvez donc tout aussi bien exécuter votre requête métier.

24
dty

Votre meilleure chance est de simplement effectuer une requête simple sur une table, par exemple:

select 1 from SOME_TABLE;

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

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

Renvoie true si la connexion n'a pas été fermée et est toujours valide. Le pilote doit soumettre une requête sur la connexion ou utiliser un autre mécanisme qui vérifie positivement que la connexion est toujours valide lorsque cette méthode est appelée. La requête soumise par le conducteur pour valider la connexion doit être exécutée dans le cadre de la transaction en cours.

44
home

Utilisez la fonction Connection.isClosed().

JavaDoc déclare:

Récupère si cet objet Connection a été fermé. Une connexion est fermée si la méthode close a été appelée ou si certaines erreurs fatales se sont produites. Cette méthode est garantie de renvoyer true uniquement lorsqu'elle est appelée après l'appel de la méthode Connection.close.

16
Buhake Sindi

Vous pouvez également utiliser

public  boolean isDbConnected(con Connection) {
    //final String CHECK_SQL_QUERY = "SELECT 1";
    try {
        if(!con.isClosed() || con!=null){
            return true;
        }
    } catch (SQLException e) {
        return false;
    }
    return false;
}
8

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.

4
Madan Sapkota

La méthode à faible coût, quelle que soit l'implémentation du fournisseur, serait de sélectionner quelque chose dans la mémoire de processus ou la mémoire du serveur, comme la version de la base de données ou le nom de la base de données actuelle. IsClosed est très mal implémenté.

Exemple:

Java.sql.Connection conn = <connect procedure>;
conn.close();
conn.getMetaData();
0
access_granted