37 votes

Quand dois-je ouvrir et fermer une connexion à SQL Server

J'ai une simple classe statique avec quelques méthodes. Chacune de ces méthodes d'ouvrir une occurrence de SqlConnection, interroger la base de données et fermer la connexion. De cette façon, je suis sûr que j'ai toujours fermer la connexion à la base de données, mais d'un autre côté, je n'aime pas toujours l'ouvrir et de fermer la connexion. Ci-dessous est un exemple de ce que mes méthodes ressembler.

public static void AddSomething(string something)
{
    using (SqlConnection connection = new SqlConnection("..."))
    {
        connection.Open();
        // ...
        connection.Close();
    }
}

Considérant que les méthodes sont à l'intérieur d'une classe statique, si j'ai un membre statique contenant une seule occurrence de SqlConnection? Comment et quand dois-je déposer? Quelles sont les meilleures pratiques?

46voto

Marc Gravell Points 482669

Non, ne le gardez pas statique SqlConnection , sauf si vous avez. Filetage serait un sujet de préoccupation, mais plus important encore - le plus souvent vous suffit de ne pas en avoir besoin. Avec votre code, tel que présenté, le regroupement de connexion interne signifie que la plupart du temps, vous obtiendrez la même connexion sous-jacente sur les appels successifs de toute façon (aussi longtemps que vous utilisez la même chaîne de connexion). Laissez le pooler faire son travail; congé le seul code.

Cela évite également les problèmes de ce qui se passe quand vous commencez à avoir deux fils... maintenant, chacun peut faire un travail sur leur propre connexion; avec statique (en supposant que vous n'utilisez pas l' [ThreadStatic]) que vous auriez à synchroniser, en introduisant des retards. Ne pas oublier de re-entrancy (c'est à dire un seul thread d'essayer d'utiliser la même connexion deux fois en même temps). Yup, laisser le seul code. Il est bien maintenant, et presque toute modification rendrait pas bien.

20voto

Jonathan Parker Points 4206

Étant donné que SqlConnection dispose d'un pool de connexions lorsque vous appelez Open () et Close (), vous n'ouvrez et ne fermez pas la connexion physique au serveur. Vous ajoutez / supprimez simplement la connexion d'un groupe de connexions disponibles. Pour cette raison, il est recommandé d'ouvrir la connexion le plus tard possible et de la fermer le plus tôt possible après l'exécution de la commande.

5voto

Christian Hagelid Points 4795

Dans votre exemple de code, il n'est pas nécessaire d'appeler la méthode close () sur l'objet de connexion, car celle-ci sera gérée automatiquement en raison du code résidant dans un bloc using.

3voto

Jeremy Points 4188

La plupart des programmeurs croient en l'ouverture tardive et la fermeture anticipée. Ce n'est un problème que si le temps de latence d'ouverture et de fermeture de la connexion ralentit l'application dans son intégralité.

Dans votre cas avec une classe statique, il est probablement préférable d'ouvrir et de fermer la connexion à chaque fois.

1voto

Al W Points 4795

Vous faites les meilleures pratiques. Ne l'ouvrez que juste avant de l'interroger et fermez-le dès que vous le pouvez. Cela peut sembler inutile au début, mais cela rendra votre application plus évolutive à long terme.

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