2009-05-14 8 views
37

J'ai une classe statique simple avec quelques méthodes. Chacune de ces méthodes ouvre une SqlConnection, interroge la base de données et ferme la connexion. De cette façon, je suis sûr que je ferme toujours la connexion à la base de données, mais d'un autre côté, je n'aime pas toujours ouvrir et fermer la connexion. Voici un exemple de ce à quoi ressemblent mes méthodes.Quand dois-je ouvrir et fermer une connexion à SQL Server

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, devrais-je avoir un membre statique contenant un seul SqlConnection? Comment et quand devrais-je le laisser tomber? Quelles sont les meilleures pratiques?

Répondre

45

Non, ne conservez pas un SqlConnection statique à moins d'y être obligé. Threading serait une préoccupation, mais plus important encore - en général, vous n'avez tout simplement pas besoin de le faire. Avec le code tel que présenté, le regroupement de connexions internes signifie que la plupart du temps vous obtiendrez la même connexion sous-jacente sur des appels successifs (à condition d'utiliser la même chaîne de connexion). Laissez le pooler faire son travail; laissez le code seul. Cela évite également les problèmes de ce qui se passe lorsque vous commencez à avoir deux threads ... maintenant, chacun peut travailler sur sa propre connexion; avec statique (en supposant que vous n'utilisez pas [ThreadStatic]) vous devrez synchroniser, en introduisant des retards. Sans oublier la ré-entrée (c'est-à-dire un seul thread essayant d'utiliser la même connexion deux fois en même temps). Ouaip; laissez le code seul. C'est bien maintenant, et presque tout changement que vous faites ne le rendrait pas bien.

3

La plupart des programmeurs croient à l'ouverture tardive et à la fermeture anticipée. Ceci n'est qu'un problème si la latence d'ouverture et de fermeture de la connexion provoque à chaque fois le ralentissement de l'application entière.

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

+1

+1 Pour compenser le downvote. Même une réouverture groupée provoquera un appel à sp_resetconnection, ce qui entraîne une certaine latence (même si elle est faible). – Andomar

1

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

+0

Cela s'applique uniquement si l'évolutivité est même possible. Pour, par exemple. une application avec une base de données intégrée différentes considérations s'appliqueraient. –

18

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

5

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

-1

Ne comptez jamais sur la connexion pour se fermer. Si ce n'est pas explicitement fermé, cela entraînera des problèmes de performance. Cela nous est arrivé sur notre projet. Oui, je suis conscient que les connexions sont gérées par un pool de connexions, mais elles doivent encore être fermées et renvoyées au pool.

+0

Il a un appel 'using' autour de la SqlConnection donc il devrait se débarrasser de la connexion une fois que c'est fait de toute façon – lisburnite

Questions connexes