2009-05-29 6 views
2

J'ai trouvé la méthode suivante pour déterminer si une base de données est opérationnelle. Cela tente d'ouvrir une connexion à une base de données et si cela échoue, renvoyez false.En C#, quel est le meilleur moyen de déterminer si une base de données est opérationnelle?

private static bool IsDatabaseConnectionUp(string connectionString) 
{ 
    System.Data.SqlClient.SqlConnection conn = null; 

    try 
    { 
     conn = new SqlConnection(connectionString); 

     conn.Open(); 

     return conn.State == System.Data.ConnectionState.Open; 
    } 
    catch (SqlException) 
    { 
     // There was an error in opening the database so it is must not up. 
     return false; 
    } 
    finally 
    { 
     if (conn != null) 
     { 
      if (conn.State == System.Data.ConnectionState.Open) 
      { 
       conn.Close(); 
      } 

      conn.Dispose(); 
     } 
    } 
} 

Est-ce la meilleure façon de déterminer si cette base de données est? La raison pour laquelle je n'aime pas cette méthode dépendra de la valeur du délai d'attente, et prendra autant de temps que le délai d'expiration.

Y a-t-il un meilleur moyen?

+1

Vous devez disposer de votre connexion. – tuinstoel

+0

Oui. On dirait que vous laissez la connexion ouverte. –

+0

Ceci est juste un exemple de code, en réalité, j'utilise un Linq Datacontext dont je dispose de la connexion et correctement. –

Répondre

2

Cela dépend vraiment exactement de ce que vous essayez de déterminer. Si vous cherchez vraiment à déterminer si "le serveur fonctionne et peut être consulté", alors je dirais que c'est probablement le moyen le plus efficace. La raison pour laquelle je dis cela est que le serveur lui-même pourrait être en place, mais il pourrait ne pas accepter les connexions, OU la connexion que l'application utilise peut être invalide (nom d'utilisateur/mot de passe incorrect). Par conséquent, étant donné cela, le délai d'attente est une chose nécessaire, car vous voulez valider la vraie connexion. Si vous voulez simplement voir si le serveur est là, vous pouvez essayer le ping, mais cela vous indique simplement si le périphérique est actif, pas nécessairement si SQL Server est entièrement opérationnel et disponible.

0

Si vous êtes intéressé par l'état de cette base de données particulière (pas le serveur de base de données dans son ensemble) alors oui, ce serait la meilleure façon de le faire.

1

Votre motif est proche mais il y a un problème avec celui-ci. Étant donné que SQLConnection implémente IDisposable, vous devez disposer de votre connexion de test avant de la renvoyer.

try 
    { 
     using (System.Data.SqlClient.SqlConnection conn = new SqlConnection(connectionString)) 
     { 

      conn.Open(); 

      return conn.State == System.Data.ConnectionState.Open; 
     } 
    } 
    catch (SqlException) 
    { 
     // There was an error in opening the database so it is must not up. 
     return false; 
    } 

Quant à ce que les autres affiches dit, si tout ce que vous voulez faire est de voir si une instance de base de données est en cours d'exécution, vous pouvez être en mesure d'énumérer les processus du système, ou utiliser un accès à la ligne de commande pour tester la base de données, mais l'une ou l'autre de ces options dépend entièrement du fournisseur de la base de données. Votre méthode est généralement correcte pour la plupart des applications.

2

Étant donné que vous recherchez spécifiquement une connexion SQLServer, prenez la chaîne de connexion dans un objet SqlConnectionStringBuilder et modifiez la valeur du délai d'expiration.

SqlConnectionStringBuilder csb = 
    new SqlConnectionStringBuilder(connectionString); 
csb.ConnectTimeout = 5; 
string newConnectionString = csb.ToString(); 

De cette façon, vous contrôlez la valeur de délai d'attente. Rappelez-vous, ne le définissez pas trop bas ou vous obtiendrez des faux positifs.

0

Si votre inquiet au sujet du délai d'attente, il y a quelques choses que vous pourriez essayer ...

Vous pouvez essayer de ping sur le serveur. À moins que les paquets ICMP ne soient interdits, cela vous indiquera plus rapidement si votre serveur est en panne. Si vous ne pouvez pas pinguer, vous ne pouvez pas vous connecter. Évidemment, ce n'est pas une garantie que vous pouvez vous connecter, mais cela rendra les choses plus vite quand vous ne le pouvez pas.

Vous pouvez utiliser une chaîne de connexion différente pour le test de connexion du serveur. Vous n'avez généralement pas besoin de l'heure par défaut complète pour établir une connexion, donc vous pourriez probablement l'abaisser sensiblement.

Si vous pouvez autoriser des données légèrement périmées, vous pouvez avoir un service qui va et vérifie la connexion toutes les X minutes (5 ou 10 ou peu importe) et ensuite aller demander à ce service pour les informations les plus récentes. C'est plus comme comment un Witness agit.

0

Cela peut être un extrait de code simplifié, mais vous ne devriez pas avoir de conn.Dispose() ou utilise (...) {...} instruction?

Modifier: nevermind, je vois les commentaires.

Questions connexes