C # – Quelles sont certaines des meilleures pratiques / astuces relatives aux performances élevées pour ADO.NET

J’ai décidé de ne pas utiliser orm et d’utiliser ADO.NET directement pour mon projet. Je sais que je sais que sa programmation prendra plus de temps, mais je veux simplement que les pages se chargent à grande vitesse, même aux heures de pointe.

Une erreur que je vois répétée maintes et maintes fois:

Tout instancier et tout configurer (DbConnection, DbCommand, DbParameters) à l’intérieur d’une méthode appelée à plusieurs resockets dans une boucle serrée.

La plupart du temps, vous pouvez refactoriser ces variables locales en tant que membres de la classe en les instanciant une seule fois et en ne conservant que les mises à jour de DbParameters dans la méthode.


UPDATED pour inclure l’exemple de code demandé dans les commentaires

Avertissement: Ceci est un échantillon rapide assemblé dans le seul but de démontrer l’importance de déplacer des éléments répétitifs hors de la boucle. D’autres meilleures pratiques ne sont pas nécessairement mises en œuvre.

public static void Show() { List people = new List(); //Everything is done inside the loop PersonDal personDal = new PersonDal(); foreach (Person person in people) { personDal.Insert(person); } //Things are setup once outside the loop. using (DbConnection connection = SqlClientFactory.Instance.CreateConnection()) { // setup the connection BetterPersonDal betterPersonDal = new BetterPersonDal(connection); connection.Open(); foreach (Person person in people) { betterPersonDal.Insert(person); } } } } class Person { public int Id { get; set; } public ssortingng Name { get; set; } } 

Sur cette première implémentation, tout est configuré chaque fois que la méthode est appelée:

 class PersonDal { public int Insert(Person person) { DbProviderFactory factory = SqlClientFactory.Instance; using (DbConnection connection = factory.CreateConnection()) { connection.Open(); connection.ConnectionSsortingng = "Whatever"; using (DbCommand command = connection.CreateCommand()) { command.CommandText = "Whatever"; command.CommandType = CommandType.StoredProcedure; DbParameter id = command.CreateParameter(); id.ParameterName = "@Id"; id.DbType = DbType.Int32; id.Value = person.Id; DbParameter name = command.CreateParameter(); name.ParameterName = "@Name"; name.DbType = DbType.Ssortingng; name.Size = 50; name.Value = person.Name; command.Parameters.AddRange(new DbParameter[] { id, name }); return (int)command.ExecuteScalar(); } } } } 

Maintenant, nous déplaçons la configuration vers la construction des objects en la laissant hors de la boucle:

 class BetterPersonDal { private DbProviderFactory factory; private DbConnection connection; private DbCommand command; private DbParameter id; private DbParameter name; public BetterPersonDal(DbConnection connection) { this.command = connection.CreateCommand(); this.command.CommandText = "Whatever"; this.command.CommandType = CommandType.StoredProcedure; this.id = command.CreateParameter(); this.id.ParameterName = "@Id"; this.id.DbType = DbType.Int32; this.name = command.CreateParameter(); this.name.ParameterName = "@Name"; this.name.DbType = DbType.Ssortingng; this.name.Size = 50; this.command.Parameters.AddRange(new DbParameter[] { id, name }); } public int Insert(Person person) { this.id.Value = person.Id; this.name.Value = person.Name; return (int)command.ExecuteScalar(); } } 

Consultez le livre Amélioration des performances et de l’évolutivité des applications .NET (disponible gratuitement en ligne dans MSDN). Il y a tout un chapitre sur l’amélioration des performances ADO.NET.

Soyez très intelligent sur la gestion de la connexion. Ouvrir une connexion à une firebase database peut coûter très cher, alors gardez cela à l’esprit lorsque vous écrivez la couche d’access à la firebase database.

Si vous n’allez pas utiliser un ORM, n’allez-vous pas non plus mettre vos données en cache? C’est un gros avantage d’utiliser un ORM. S’il n’y a pas de cache de données, vous devrez rechercher des moyens de mettre en cache le code HTML / JavaScript. Ceci peut être accompli à l’aide de la directive OutputCache et de SqlDependency. Ou en publiant des fichiers HTML et JavaScript statiques. Dans les deux cas, vous pourrez gérer une charge plus importante si vous ne frappez pas constamment la firebase database à chaque requête.

Quelques liens:

Amélioration des performances du site Web ASP.NET http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx

10 Les secrets de performance et d’évolutivité ASP.NET http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx

Blog Omar AL Zabir sur ASP.NET Ajax et .NET 3.5 http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx

L’article sur les liens de Martin est excellent. J’appendais simplement que vous voulez absolument utiliser un DataReader au lieu d’un DataSet (j’adore les DataSets, mais pas pour des raisons de performances).

Voir ces articles:

Astuces relatives aux performances d’ADO.NET et de SQL Server

Réglage des performances des applications .NET

Performance ADO.NET