ASP.NET: как улучшить использование памяти в этих нескольких строках кода? - PullRequest
0 голосов
/ 10 ноября 2011

У меня есть база данных, в которой есть только одна таблица из примерно 7000 записей. У меня есть GridView для отображения этих записей по 10 строк за раз (я использую функцию автоматической подкачки, предоставляемую GridView).

Вот как я читаю в таблице и показываю записи. По-видимому, я читаю всю таблицу, но отображаю только 10 строк, которые, кажется, расточительны из памяти. НО я думаю, что мне нужно прочитать весь Shebang, чтобы пейджинг мог работать. Я ошибся? Если да, то как мне улучшить этот код:

private void ShowGridViewData()
    {
        // I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER

        string queryString = (string)Session["queryString"];
        String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString;
        DataSet ds = new DataSet();

        SqlConnection connection = new SqlConnection(connectionString);
        SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);



        // Fill the DataSet.
        adapter.Fill(ds);

        GridView1.DataSource = ds;
        GridView1.DataBind();


        adapter.Dispose();
        connection.Close(); 


    }

Дополнительная информация : Я не могу изменить код для использования LINQ. И еще одна причина, по которой я решил прочитать всю таблицу, заключается в том, что для подкачки страниц не требуется доступ к другой базе данных. Я могу ошибаться с этим рассуждением.

Ответы [ 5 ]

3 голосов
/ 10 ноября 2011

Поскольку вы добавили комментарий, который полностью меняет динамику вопроса, я публикую второй ответ.

Чтобы не заходить в базу данных каждый раз, я бы сохранял ваш набор данных в сеансе и каждый раз получал к нему доступ.Я изменил ваш код сверху, чтобы включить это, единственное, что я не вижу, это то, где вы реализуете свою подкачку в GridView.Я предполагаю, что это включено в код, который был «удален, чтобы избежать беспорядка»

private void ShowGridViewData()
{
    // I LEAVE ONLY RELEVANT CODE TO AVOID CLUTTER

    DataSet ds = new DataSet();
    if (Session["ProductsDataSet") == null) {

        string queryString = (string)Session["queryString"];
        String connectionString = ConfigurationManager.ConnectionStrings["productsSQLConnectionString"].ConnectionString;

        SqlConnection connection = new SqlConnection(connectionString);
        SqlDataAdapter adapter = new SqlDataAdapter(queryString, connection);

        // Fill the DataSet.
        adapter.Fill(ds);

        Session["ProductsDataSet"] = ds;

    } else {
        ds = (DataSet)Session["ProductsDataSet"]
    }

    GridView1.DataSource = ds;
    GridView1.DataBind();


    adapter.Dispose();
    connection.Close(); 
}
2 голосов
/ 11 ноября 2011

НО я думаю, что мне нужно прочитать весь шебанг, чтобы пейджинг мог работать.

Да, но вы можете использовать подкачку без загрузки всего набора данных с помощью источника данных объекта, см. Ручная настройка PageCount GridView, когда DataSource не возвращает полный набор результатов?

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

Да и нет. Это действительно зависит от вашего варианта использования. Как правило, вам следует больше беспокоиться об использовании ресурсов по запросу, а не по сеансу Таким образом, вы не выделяете ресурсы, которые не используются (плата за игру)

Поэтому обычно я следую модели оплаты за игру и получаю только те данные, которые собираюсь показать, если только мы не имеем дело с

Дорогие SQL-операции Если ваш набор результатов невелик, но на его создание уходит много времени, я хочу добавить его в кеш, как ответ Энтони Шоу.

Глобальное состояние Если это то, что распределяется между пользователями, то платит только первый пользователь, и игра бесплатна для всех остальных. Но вам все еще нужна разумная политика кэширования )

1 голос
/ 10 ноября 2011

Один из вариантов - разрешить SQL так пейджинг в вашей хранимой процедуре или с помощью LINQ. Этот пост охватывает это: эффективный способ реализации пейджинга

1 голос
/ 10 ноября 2011

Это зависит от того, что вы делаете, но если у вас есть контент, который не обновляется, рассмотрите возможность его кэширования.Затем, когда будут обновлены все, что вы отображаете, удалите / обновите кеш.Это поможет предотвратить новое соединение с SQL, если ничего не изменилось!

1 голос
/ 10 ноября 2011

Посмотрите на эту запись в блоге. Он создает специальный SQL-пейджинг с помощью функции ROW_NUMBER () в SQL. Вам нужно будет указать правильный номер страницы.

http://blogs.x2line.com/al/archive/2005/11/18/1323.aspx

БОНУС, пример уже использует 10 в качестве размера страницы:)

...