Question

Par exemple, je dois remplir de nombreux DataTables avec la méthode Fill () de SQLDataAdapter:

DataAdapter1.Fill(DataTable1);
DataAdapter2.Fill(DataTable2);
DataAdapter3.Fill(DataTable3);
DataAdapter4.Fill(DataTable4);
DataAdapter5.Fill(DataTable5);
....
....

Même tous les objets dataadapter utilisent le même SQLConnection, chaque méthode Fill ouvre et ferme la connexion, sauf si l'état de la connexion est déjà ouvert avant l'appel de la méthode.

Ce que je veux savoir, c'est comment les ouvertures et les fermetures SQLConnections inutilement affectent les performances de l'application. Combien faut-il à l'échelle pour voir les effets pervers de ce problème (100 000 utilisateurs simultanés?). Dans un site Web de taille moyenne (50 000 utilisateurs quotidiens), vaut-il la peine de se préoccuper de chercher tous les appels Fill (), de les garder ensemble dans le code et d’ouvrir la connexion avant tout appel Fill () et de les fermer ensuite?

Était-ce utile?

La solution

ADO.NET dispose d’un pool de connexions, par exemple. Lorsque vous fermez une connexion, elle n'est pas vraiment complètement fermée, mais "recyclée". si vous demandez une nouvelle connexion avec exactement la même chaîne de connexion.

Néanmoins, si vous savez déjà à l'avance qu'il vous faudra appeler ces cinq méthodes de remplissage une à une, je vous le recommande vivement

.
  • ouverture de la connexion
  • lecture des cinq tables de données de la base de données
  • refermer la connexion tout de suite

Il est de pratique exemplaire de le faire de cette façon, cela ne vous fait pas de mal - alors faites-le! :-)

Marc

PS: Le regroupement de connexions dans ADO.NET ne fonctionne bien entendu que si vous ne l’avez pas désactivé! :-) Il est activé par défaut - vous devez le désactiver explicitement.

Autres conseils

Point clé:

  • Pourquoi ouvrir, conserver et réutiliser des connexions?

    Performances

Il existe de nombreuses raisons pour lesquelles vous souhaitez ouvrir et fermer des connexions. Vous devez choisir le meilleur compromis pour votre utilisation. Vous pouvez faire les deux: utilisez une connexion ouverte pendant une période donnée et / ou un nombre défini de transactions, puis fermez-la et ouvrez-en une nouvelle.

Ouvrir et fermer des connexions SQL est coûteux par rapport à d'autres tâches simples de la base de données. Mais, si votre tâche actuelle prend déjà beaucoup de temps, la surcharge supplémentaire risque de ne pas être remarquée (si vous cachez déjà la période d'attente de la tâche réelle - de sorte que l'utilisateur ne commence pas à cliquer de manière aléatoire, par exemple réessayez).

Scénario de test:

Vous pouvez mesurer votre différence en écrivant deux versions d'une requête test. Sélectionnez une tâche SQL simple (il doit être identique dans chaque version).

Dans la version one , faites-le avec une seule connexion ouverte constante à l'extérieur de la boucle, en passant par votre simple tâche X fois.

Dans la seconde , faites-le en ouvrant et fermant la connexion à l'intérieur de la boucle .

Changez le nombre X de fois pour correspondre à votre utilisation et à vos attentes. Cela devrait vous donner une bonne idée de l'impact sur votre système .

J'espère que cela vous aide à comprendre l'essentiel ... Jack.

RÉPONSE NECRO: Le meilleur moyen consiste à placer la connexion dans une instruction 'using' afin qu'elle corresponde au travail à effectuer:

using (SqlConnection conn = new SqlConnection())
{
    DataAdapter1.Fill(DataTable1);
    DataAdapter2.Fill(DataTable2);
    DataAdapter3.Fill(DataTable3);
    DataAdapter4.Fill(DataTable4);
    DataAdapter5.Fill(DataTable5);
    ...
    ...
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top