137 votes

"ouvrir/fermer" SqlConnection ou de garder ouvertes?

J'ai mon entreprise, la logique mise en œuvre dans de simples classes statiques avec des méthodes statiques. Chacune de ces méthodes ouvre/ferme la connexion SQL, lorsqu'il est appelé:

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

Mais je pense que d'éviter l'ouverture et la fermeture d'une connexion enregistre des performances. J'ai fait quelques tests loooong temps auparavant avec OleDbConnection classe (pas sûr de SqlConnection), et il a certainement aidé à travailler comme ça (comme je me souviens bien):

//pass the connection object into the method
public static void AddSomething(string something, SqlConnection connection)
{
    bool openConn = (connection.State == ConnectionState.Open);
    if (!openConn) connection.Open();
    // ....
    if (!openConn) connection.Close();
}

Donc la question est - ce que je devrais choisir la méthode (a) ou de la méthode (b) ? J'ai lu sur un autre stackoverflow question que le regroupement de connexions de performances enregistrées pour moi, je n'ai pas de peine à tous les...

PS. C'est un ASP.NET app - connexions existent uniquement lors d'une web-demande. Pas une victoire de l'application ou du service.

94voto

astander Points 83138

Tenir à l'option.

Le regroupement de connexion est votre ami.

82voto

WeNeedAnswers Points 1836

méthode (a), à chaque fois. Lorsque vous démarrez l'échelle de votre application, la logique qui traite avec l'etat va devenir une vraie douleur. Le regroupement de connexion, est ce qu'il dit sur l'étain. Il suffit de penser de ce qui se passe lorsque l'application des échelles, et comment serait-il facile de gérer les connexions. Le pool de connexion fait du bon travail. Si vous inquiet au sujet de la performance penser à une sorte de mémoire cache mécanisme, alors que rien n'est bloqué.

36voto

Neil Barnwell Points 20731

Toujours fermer les connexions dès que vous avez terminé avec eux, de sorte qu'ils sous-tendent la connexion à la base de retourner dans la piscine et être disponible pour les autres appelants. Le regroupement de connexion est assez bien optimisé, il n'y a pas de peine perceptible pour le faire. Le conseil est essentiellement la même que pour les opérations les garder court et à se fermer lorsque vous avez terminé.

Cela devient encore plus compliqué si vous êtes en cours d'exécution en ms DTC questions en utilisant une seule transaction autour de code qui utilise plusieurs connexions, auquel cas vous avez réellement n'avez pas à partager la connexion de l'objet et uniquement le fermer une fois la transaction effectuée.

Cependant, vous êtes en train de faire les choses à la main ici, de sorte que vous pouvez enquêter sur les outils qui gèrent les connexions pour vous, comme les ensembles de données, Linq to SQL, Entity Framework ou NHibernate.

14voto

Christopher Pfohl Points 4179

Avertissement: je sais que c'est vieux, mais j'ai trouvé un moyen facile de démontrer ce fait, donc je vais mettre dans mes deux cents.

Si vous éprouvez de la difficulté à croire que la mise en commun est vraiment va être plus rapide, puis donner à ceci un essai:

Ajouter le suivant quelque part:

using System.Diagnostics;
public static class TestExtensions
{
    public static void TimedOpen(this SqlConnection conn)
    {
        Stopwatch sw = Stopwatch.StartNew();
        conn.Open();
        Console.WriteLine(sw.Elapsed);
    }
}

Maintenant remplacer tous les appels à l' Open() avec TimedOpen() et exécuter votre programme. Maintenant, pour chaque chaîne de connexion que vous avez, la console (sortie) fenêtre aura une longue course ouverte, et un tas de très vite s'ouvre.

Si vous voulez de l'étiquette, vous pouvez ajouter new StackTrace(true).GetFrame(1) + de l'appel à l' WriteLine.

12voto

Tony Kh Points 756

Il y a des distinctions entre physique et logique des connexions. DbConnection est une sorte de lien logique et il utilise la physique sous-jacente de connexion à Oracle. La fermeture/l'ouverture DbConnection n'affecte pas les performances de votre, mais rend votre code propre et stable - raccordement des fuites de l'impossible dans ce cas.

Aussi, vous devez retenir sur les cas lorsqu'il y a des limitations pour les connexions en parallèle sur le serveur de base de données - prendre en compte, il est nécessaire de réaliser des connexions à très court.

Le pool de connexion vous permet de vous libérer de l'état de connexion de l'enregistrement, il suffit d'ouvrir, de l'utilisation et de fermer immédiatement.

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