2010-01-07 5 views
5

Il ya quelque temps, j'ai écrit un calque ORM pour mon application .net où toutes les lignes de base de données sont représentées par une sous-classe DatabaseRecord. Il y a un certain nombre de méthodes comme Load(), Save() etc. Dans ma mise en œuvre initiale j'ai créé une connexion à la DB dans le constructeur de DatabaseRecord par exemple.Frais généraux de création de SqlConnection dans C#

connection = new SqlConnection(
    ConfigurationManager.ConnectionStrings["ConnectionName"].ConnectionString 
); 

Je puis appeler Open() et Close() sur ce SqlConnection au début et à la fin de mes méthodes qui accèdent à la base de données. Cela m'a semblé (comme quelqu'un qui était familier avec la programmation mais nouveau pour C# et .net) pour être le moyen le plus efficace de faire les choses - avoir une connexion et l'ouvrir/fermer si nécessaire dans la classe.

Je viens en train de faire un peu de lecture bien et il semble que ce modèle est recommandé dans plusieurs endroits:

using (var connection = new SqlConnection(...)) { 
    connection.Open(); 
    // Stuff with the connection 
    connection.Close(); 
} 

Je peux voir pourquoi il est souhaitable - la connexion est automatiquement Dispose() d même si la Ce que vous faites au milieu provoque une exception non interceptée. Je me demandais juste ce que les frais généraux sont pour appeler new SqlConnection() potentiellement plusieurs fois comme ça.

La mise en commun des connexions est activée, j'imagine que les frais généraux sont minimes et la deuxième approche devrait être la meilleure pratique, mais je voulais simplement m'assurer que mes hypothèses étaient justes.

+0

Merci pour tous les réponses incroyablement rapides! – vitch

Répondre

8

Oui, c'est la meilleure pratique. Le using rend votre appel à Close() exception-safe.

Et le surcoût de la création d'un (quelconque) objet est en effet minime, et le plus petit pour les objets de courte durée (qui restent dans la génération 0 du GC).

Notez que vous n'avez plus besoin d'appeler Close() à la fin du bloc using, il est automatiquement fait pour vous (Dispose == Close).

+0

Comment minime? Existe-t-il des benchmarks où que ce soit qui montrent combien les performances sont perdues lors de l'ouverture et de la fermeture des connexions? Existe-t-il une prise de contact réseau qui se passe lorsque la méthode Open est appelée? –

+0

En fait, je pense que cet article répond parfaitement à ma question. https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql-server-connection-pooling –

+0

Si cet article est correct, la mise en commun de connexion doit traiter explicitement handshake etc.et assurez-vous qu'aucun handshaking inutile ne continue. –

1

Ceci est partiellement une question de goût. Tant que vous utilisez le regroupement de connexions, le coût de création d'une nouvelle connexion (recyclage d'une connexion groupée) est minime. En règle générale, le modèle recommandé consiste donc à créer de nouveaux objets de connexion si nécessaire.

Si vous exécutez plusieurs commandes immédiatement après l'autre alors je ne vois aucune raison de créer de nouvelles connexions pour chacun d'eux, mais vous devriez éviter de tenir à ouvrir des connexions pour longtemps.

, vous devez également noter que la méthode Dispose fermera la connexion pour vous. Il n'est donc pas nécessaire d'appeler à la fois Close et Dispose. Puisque la clause using appellera disposer à la fin, il n'est normalement pas nécessaire d'appeler Close.

1

Si vous n'êtes pas sûr au sujet du coût de connexion d'ouverture/fermeture, ont la SqlConnection une variable membre de votre classe, mais faire la classe IDisposable et l'évacuation des SqlConnection lorsque la classe est disposé

+0

En fait, en y réfléchissant plus, je pense que cela pourrait être l'approche la plus efficace. J'ai étoffé votre suggestion un peu dans une autre question - ce serait génial si vous pouviez me faire savoir si j'ai bien compris: http://stackoverflow.com/questions/2020576/creating-an-idisposable-class-in -c-qui-nettoie-une-sqlconnection-quand-finishe – vitch

Questions connexes