2010-11-06 4 views
31

Si la connexion à une base de données consomme beaucoup de ressources, pourquoi une connexion à la base de données devrait-elle toujours être fermée dans votre application si vous devez l'ouvrir à nouveau? Puis-je simplement rendre cette connexion disponible globalement dans mon application afin que d'autres classes et méthodes puissent la réutiliser?Pourquoi toujours fermer la base de données Connexion à la base de données?

Par exemple (dans le code pseudo):

public class PopulateGridViews() 
{ 
    public SqlConnection conn = new SqlConnection(@"Database:DATABASE"); 
    conn.Open(); 

    void PopulateGrid1() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE1"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid1 
    } 

    void PopulateGrid2() 
    { 
     SqlCommand cmd = new SqlCommand("SELECT * FROM TABLE2"); 
     cmd.Connection = conn; 
     cmd.ExecuteNonQuery(); 
     cmd.Dispose(); 
     // Populate Grid2 
    } 
} 
+0

Je suggère de lire [SQL Server Connection Pooling (ADO.NET)] (http://msdn.microsoft.com/en-us/library/8xx3tyca.aspx). –

Répondre

45

Vous ne devriez pas laisser ouvrir des connexions.

Vous devez:

  1. connexions ouvertes le plus tard possible
  2. connexions Fermer le plus rapidement possible

La connexion elle-même est renvoyée au pool de connexion. Les connexions sont une ressource limitée et relativement coûteuse. Toute nouvelle connexion que vous établissez qui a exactement la même chaîne de connexion sera en mesure de réutiliser la connexion à partir du pool.

Nous vous recommandons fortement de toujours fermer la connexion lorsque vous êtes fini de l'utiliser de telle sorte que la connexion sera retourné à la piscine . Vous pouvez le faire en utilisant les méthodes Close ou Dispose de l'objet Connection ou en ouvrant toutes les connexions à l'intérieur d'une instruction using en C# ou une instruction Using en Visual Basic. Les connexions qui ne sont pas explicitement fermées peuvent ne pas être ajoutées ou renvoyées à la piscine. Pour plus d'informations , voir à l'aide d'instruction (C# référence) ou comment: disposer d'une ressource système pour Visual Basic. Ref.

Vous devriez envelopper correctement tout ce qui met en œuvre IDisposable dans un bloc de déclaration using:

using (SqlConnection connection = new SqlConnection(connectionString)) 
{ 
    connection.Open(); 

    ... 

    command.ExecuteNonQuery(); 
} 
+0

où devrais-je mettre ma prise si quelques erreurs se produisent pendant la connexion? – yonan2236

+1

Si vous utilisez le bloc d'utilisation tel que suggéré par @Mitch Wheat, il sera automatiquement fermé s'il y a une erreur. – David

+0

Il n'y a donc aucun moyen de déterminer pour connaître les erreurs qui se sont produites? – yonan2236

6

Parce que (certaines) bases de données tiennent également ouvrir une connexion jusqu'à dire par l'application d'appel pour le fermer. Si vous recevez des centaines d'appels dans une base de données, il y a 100 connexions ouvertes qui attirent les ressources. Il n'est pas rare d'avoir des milliers ou des centaines de milliers d'appels à une base de données dans une application occupée, et tôt ou tard, les performances de la base de données vont tuer les performances de l'application.

C'est vraiment du bon sens. Si vous avez une raison valable de le garder ouvert, alors faites-le. Si non, fermez-le dès que vous en avez fini avec. Mais il vaut mieux avoir la bonne habitude de fermer les connexions afin de ne pas les laisser ouvertes quand vous n'en avez pas l'intention. C'est une bonne habitude de porter votre ceinture de sécurité ou de fermer la porte du réfrigérateur lorsque vous ne recevez pas de nourriture.

Cet article indique bien (même si elle est un peu obsolète):

http://www.bewebmaster.com/84.php

Un problème fréquent chez l'hébergement entreprises est que les sites Web ASP ne le font pas fermer les connexions de base de données après ils sont ouverts. Il s'agit d'une étape de base que vous devez considérer comme faisant partie du code obligatoire . Si vous ne fermez pas vos connexions de base de données, de nombreux problèmes peuvent se produire comme pages Web suspendus, charges de pages lentes et plus.

Pensez-y comme passant par une porte à votre maison. Peut-être que la porte se fermera toute seule, mais peut-être que non. Si ne ferme pas, qui sait ce qui se passera . Si vous vivez dans le pays, un ours pourrait marcher. Si vous vivez dans la ville , un mugger pourrait marcher. Bon, peut-être bien en laissant une base de données connexion ouverte ne conduira pas à quoi que ce soit mal que ça, mais il va conduire à beaucoup de maux de tête inutiles pour vous et votre société d'hébergement.

+1

Nous avons hérité d'une application dont nous avons hérité lors des connexions de travail, ce n'est pas sympa :(Après un certain temps, le serveur SQL a cessé de répondre aux nouvelles connexions et toutes les autres applications ont cessé de fonctionner. – Skurmedel

Questions connexes