Я решил не использовать orm и собираюсь использовать прямой ADO.NET для моего проекта. Я знаю, что знаю, что потребуется больше времени на программирование, но я просто хочу, чтобы страницы загружались с высокой скоростью даже в пиковое время.
С# - Что такое некоторые лучшие рекомендации/советы для ADO.NET
Ответ 1
Одна ошибка, которую я вижу, повторяется снова и снова:
Создание и настройка всего (DbConnection, DbCommand, DbParameters) внутри метода, который многократно вызывается в узком цикле.
В большинстве случаев вы можете реорганизовать эти локальные переменные как члены класса, создавая их экземпляр только один раз и сохраняя только обновления DbParameters внутри метода.
ОБНОВЛЕНО включить образец кода, указанный в комментариях
Отказ от ответственности: Это быстро собранный образец для единственного намерения продемонстрировать мысль о перемещении повторяющихся вещей из цикла. Другие лучшие практики не обязательно реализуются.
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 string Name { get; set; }
}
В этой первой реализации каждая вещь настраивается каждый раз, когда вызывается метод:
class PersonDal {
public int Insert(Person person) {
DbProviderFactory factory = SqlClientFactory.Instance;
using (DbConnection connection = factory.CreateConnection()) {
connection.Open();
connection.ConnectionString = "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.String;
name.Size = 50;
name.Value = person.Name;
command.Parameters.AddRange(new DbParameter[] { id, name });
return (int)command.ExecuteScalar();
}
}
}
}
Теперь мы переместим установку в конструкцию объектов, оставив ее вне цикла:
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.String;
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();
}
}
Ответ 2
Взгляните на Улучшение производительности и масштабируемости .NET-приложений (доступно в Интернете бесплатно, в MSDN). Там целая глава об улучшении производительности ADO.NET.
Ответ 3
Будьте очень умны в управлении соединениями. Открытие соединения с БД может быть очень дорогостоящим, поэтому старайтесь учитывать это при написании уровня доступа к базе данных.
Ответ 4
См. следующие статьи:
Рекомендации ADO.NET и SQL Server
Ответ 5
Если вы не собираетесь использовать ORM, вы также не собираетесь кэшировать свои данные? Это большое преимущество использования ORM. Если нет кэша данных, вам нужно будет изучить способы кэширования HTML/JavaScript. Это можно выполнить с помощью директивы OutputCache и SqlDependency. Или путем публикации статических файлов HTML и JavaScript. В любом случае, вы сможете обрабатывать более высокую нагрузку, если вы не будете постоянно ударять по базе данных по каждому запросу.
Некоторые ссылки:
Улучшение производительности веб-сайта ASP.NET http://www.codeproject.com/KB/aspnet/aspnetPerformance.aspx
10 Секреты производительности и масштабируемости ASP.NET http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx
Блог Omar AL Zabir на ASP.NET Ajax и .NET 3.5 http://msmvps.com/blogs/omar/archive/tags/performance/default.aspx
Ответ 6
Статья ссылок Мартина отличная. Я бы просто добавил, что вы определенно хотите использовать DataReader вместо DataSet (мне нравятся DataSets, но не по соображениям производительности).