web-dev-qa-db-fra.com

Pourquoi toujours fermer la connexion à la base de données?

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

Par exemple (en pseudo-code):

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
    }
}
35
yonan2236

Vous ne devriez pas laisser de connexions ouvertes.

Vous devriez:

  1. Connexions ouvertes le plus tard possible
  2. Fermer les connexions dès que possible

La connexion elle-même est renvoyée au pool de connexions. Les connexions sont une ressource limitée et relativement coûteuse. Toute nouvelle connexion établie avec exactement la même chaîne de connexion pourra réutiliser la connexion à partir du pool.

Nous vous recommandons fortement de toujours fermez la connexion quand vous êtes fini de l'utiliser pour que le la connexion sera retournée au bassin. Vous pouvez le faire en utilisant soit le Fermez ou supprimez les méthodes du Objet de connexion, ou en ouvrant tout connexions à l'intérieur d'une instruction using en C # ou une instruction Using en Visual De base. Connexions qui ne sont pas explicitement fermé peut ne pas être ajouté ou retourné à la piscine. Pour plus informations, voir Using statement (Référence C # ) ou Comment: Jeter un Ressource système pour Visual Basic. Réf .

Vous devriez envelopper de manière appropriée tout ce qui implémente IDisposable dans un bloc d'instructions using:

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

     ...

     command.ExecuteNonQuery();
 }
49
Mitch Wheat

Parce que (certaines) bases de données maintiennent également une connexion ouverte jusqu'à ce que l'application appelante la ferme. Si vous recevez des centaines d'appels vers une base de données, celle-ci dispose de 100 connexions ouvertes connectant des ressources. Il n'est pas rare que des milliers, voire des centaines de milliers d'appels, soient dirigés vers une base de données dans une application occupée. Tôt ou tard, les performances de la base de données annuleront les performances de l'application.

C'est vraiment juste du bon sens. Si vous avez une raison valable de le garder ouvert, faites-le. Sinon, fermez-le dès que vous avez fini. Mais il vaut mieux avoir la bonne habitude de fermer les connexions afin de ne pas les laisser ouvertes quand vous ne le souhaitez pas. C'est une bonne habitude de porter sa ceinture de sécurité ou de fermer la porte du réfrigérateur quand on ne sort pas de nourriture.

Cet article le dit bien (même s'il est un peu désuet):

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

Un problème commun chez les hébergeurs entreprises est que ASP les sites Web ne le font pas fermez les connexions de base de données après ils sont ouverts. Ceci est une étape fondamentale que vous devriez considérer faire partie de code obligatoire. Si vous ne fermez pas vos connexions de base de données, beaucoup des problèmes peuvent survenir comme des pages Web en suspens, des charges de page lentes, etc.

Pensez-y comme passant par une porte à ta maison. Peut-être que la porte va se fermer par lui-même, mais peut-être que non. Si ça ne ferme pas, qui sait ce qui va se produire. Si vous habitez à la campagne, un ours pourrait entrer. Si vous vivez dans le ville, un agresseur pourrait entrer. Bon, bien peut-être laisser une base de données connexion ouverte ne mènera à rien si mauvais, mais cela conduira à beaucoup de maux de tête inutiles pour vous et pour votre société d'hébergement.

8
David

Il est clair que, si vous ne fermez pas la connexion, cela consommerait votre ressource de façon continue et ce qui aurait un impact global sur votre application. Elle pourrait également ne pas être ajoutée ou renvoyée au pool.

0
AbdurRahman Lakhani