Подтвердить что ты не робот

С# - Что такое некоторые лучшие рекомендации/советы для ADO.NET

Я решил не использовать orm и собираюсь использовать прямой ADO.NET для моего проекта. Я знаю, что знаю, что потребуется больше времени на программирование, но я просто хочу, чтобы страницы загружались с высокой скоростью даже в пиковое время.

4b9b3361

Ответ 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();
    }
}

Ответ 3

Будьте очень умны в управлении соединениями. Открытие соединения с БД может быть очень дорогостоящим, поэтому старайтесь учитывать это при написании уровня доступа к базе данных.

Ответ 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, но не по соображениям производительности).