powered by simpleCommunicator - 2.0.59     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / SqlDatasource и тормоза на странице
5 сообщений из 5, страница 1 из 1
SqlDatasource и тормоза на странице
    #38853258
leon777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Добрый день уважаемые форумчане!

Есть небольшой проект на ASP.Net: на странице планировщик (DevExpress)
который берет данные из Firebird БД (.fdb) ~6000 записей.
Когда было несколько сотен записей все работало удовлетворительно, когда их стало несколько тысяч пошли тормоза.

Планировщик загружает данные через SQlDatasource, причем SelectCommand и FilterExpression устанавливаются динамически в Page_Init (для каждой роли пользователя свои запросы + фильтры заданий планировщика на странице).

Тормоза происходят при смене дней или ресурсов на планировщике, т.е. когда планировщик посылает колбэк и каждый раз (как я понимаю) происходит загрузка данных.

Я так понял, что SqlDatasource перезагружает данные при любом постбэк/колбэк !?

Нужно уходить от SqlDatasource? Использовать кэширование? Посоветуйте в каком направлении копать?
...
Рейтинг: 0 / 0
SqlDatasource и тормоза на странице
    #38853327
monstrU
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
leon777Добрый день уважаемые форумчане!

Есть небольшой проект на ASP.Net: на странице планировщик (DevExpress)
который берет данные из Firebird БД (.fdb) ~6000 записей.
Когда было несколько сотен записей все работало удовлетворительно, когда их стало несколько тысяч пошли тормоза.

Планировщик загружает данные через SQlDatasource, причем SelectCommand и FilterExpression устанавливаются динамически в Page_Init (для каждой роли пользователя свои запросы + фильтры заданий планировщика на странице).

Тормоза происходят при смене дней или ресурсов на планировщике, т.е. когда планировщик посылает колбэк и каждый раз (как я понимаю) происходит загрузка данных.

Я так понял, что SqlDatasource перезагружает данные при любом постбэк/колбэк !?

Нужно уходить от SqlDatasource? Использовать кэширование? Посоветуйте в каком направлении копать?

а как же. грузит еще как. только не SQLDatasource а DevExpress.
особенно если в Page_Load вы Page.IsPostBack не разделяете.
направление такое:
1. убрать devexpress (это просто).
2. настроить devexpress - чтобы он на каждый клик не грузил всю выборку заново. (это сложно)
...
Рейтинг: 0 / 0
SqlDatasource и тормоза на странице
    #38857651
monstrUleon777Добрый день уважаемые форумчане!

Есть небольшой проект на ASP.Net: на странице планировщик (DevExpress)
который берет данные из Firebird БД (.fdb) ~6000 записей.
Когда было несколько сотен записей все работало удовлетворительно, когда их стало несколько тысяч пошли тормоза.

Планировщик загружает данные через SQlDatasource, причем SelectCommand и FilterExpression устанавливаются динамически в Page_Init (для каждой роли пользователя свои запросы + фильтры заданий планировщика на странице).

Тормоза происходят при смене дней или ресурсов на планировщике, т.е. когда планировщик посылает колбэк и каждый раз (как я понимаю) происходит загрузка данных.

Я так понял, что SqlDatasource перезагружает данные при любом постбэк/колбэк !?

Нужно уходить от SqlDatasource? Использовать кэширование? Посоветуйте в каком направлении копать?

а как же. грузит еще как. только не SQLDatasource а DevExpress.
особенно если в Page_Load вы Page.IsPostBack не разделяете.
направление такое:
1. убрать devexpress (это просто).
2. настроить devexpress - чтобы он на каждый клик не грузил всю выборку заново. (это сложно)
шайтан используэт SQLDataSource и не используэт кэшироване
2.а настрой кешированее
2.б создай свой прослойка бизнес уровень -- ObjectDataSource для тебя
...
Рейтинг: 0 / 0
SqlDatasource и тормоза на странице
    #38857688
leon777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Ребята спасибо за ответы! Тоже копаю, что нарою отпишусь. От Dev пока отказаться проблематично - слишком много логики завязано на их довольно богатом функционале ( в т.ч. развитом клиентском АПИ)!

Пока рою в сторону:

1) кэширование (для не очень больших справочных таблиц, которые не меняются это вообще по-моему маст ду :-)
2) своя прослойка, как было предложено ObjectDataSource

3) Настройка Dev Scheduler таким образом, чтобы в SqlDataSource/ObjectDataSource запрашивались не все данные, а только те, что нужны для отображения на текущей странице планировщика (для указанных ресурсов и дат). По-моему там есть что-то типа пользовательского биндинга через события...

4) Оптимизация запросов

Еще вопрос попутно: кэш который использует SqlDataSource можно обновлять самому вручную?
...
Рейтинг: 0 / 0
SqlDatasource и тормоза на странице
    #38861747
leon777
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Помимо всего сказанного есть несколько стандартных решений от самих DevExpress
для работы с большими объемами данных.

1) Для планировщика ASPxScheduler.

Вместо полной загрузки данных используется событие FetchAppointments планировщика. В него передается
интервал, запрашиваемый планировщиком в текущий момент и мы должны запросить данные из БД именно за этот интервал.
Но есть нюанс при работе с NavigationButtons планировщика (кнопочки для навигации к ближайшему заданию для
ресурса) и DateNavigator (календарик, где отмечены черным даты для которых есть задания).
Т.к. мы запрашиваем только часть данных мы можем не знать о каких-либо заданиях находящихся
за пределами указанного интервала, поэтому разработчики предлагают добавлять смещение интервалов (padding)
варьируя между детализацией и производительностью.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
<dxwschs:ASPxScheduler ID="ASPxScheduler1" runat="server" ClientIDMode="AutoID" 
            Start="2014-06-26" GroupType="Resource" Width="100%" 
            AppointmentDataSourceID="AppointmentSqlDataSource" 
            ResourceDataSourceID="ResSqlDataSource" 
            ClientInstanceName="ASPxScheduler1" OnFetchAppointments="ASPxScheduler1_FetchAppointments">
....
</dxwschs:ASPxScheduler>

<asp:SqlDataSource ID="AppointmentSqlDataSource" runat="server" 
        ConnectionString="<%$ ConnectionStrings:fbcs %>" 
        ProviderName="<%$ ConnectionStrings:fbcs.ProviderName %>" 
        SelectCommand="SELECT * FROM APPOINTMENTS 
                        WHERE  (actualstart >= @START_DATE) AND (actualstart <= @END_DATE) OR
                               (actualfinish >= @START_DATE) AND (actualfinish <= @END_DATE)">
        <SelectParameters>
            <asp:Parameter Name="START_DATE" />
            <asp:Parameter Name="END_DATE" />
        </SelectParameters>
    </asp:SqlDataSource>

    <asp:SqlDataSource ID="ResSqlDataSource" runat="server" 
            ConnectionString="<%$ ConnectionStrings:fbcs %>" 
            ProviderName="FirebirdSql.Data.FirebirdClient" 
            SelectCommand="select * from RESOURCE">
    </asp:SqlDataSource>  




Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
public partial class Test : System.Web.UI.Page
{
    TimeInterval lastFetchedInterval = new TimeInterval();

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void ASPxScheduler1_FetchAppointments(object sender, DevExpress.XtraScheduler.FetchAppointmentsEventArgs e)
    {
        DateTime start = e.Interval.Start;
        DateTime end = e.Interval.End;

        TimeSpan padding = TimeSpan.FromDays(100);

        if (start <= lastFetchedInterval.Start || end >= lastFetchedInterval.End)
        {
            lastFetchedInterval = new TimeInterval(start - padding, end + padding);

            AppointmentSqlDataSource.SelectParameters["START_DATE"].DefaultValue = lastFetchedInterval.Start.ToString();
            AppointmentSqlDataSource.SelectParameters["END_DATE"].DefaultValue = lastFetchedInterval.End.ToString();
        }
    }
}



2) Для комбобокса ASPxCombobox.


Вместо полной загрузки данных используются два события: запрос одной записи по ID (когда нужно отобразить поле Text комбобокса
по его Value) и для фильтрации по условию.События OnItemRequestedByValue и OnItemsRequestedByFilterCondition соответственно.

В примере БД Firebird 1.5. Первое событие (запрос по ID) там все просто.
Во втором случае BeginIndex/EndIndex нужны для постраничного отображения результатов
фильтрации. Когда я просто открываю комбо (не вводя условие фильтра), то передается
пустая строка '' и должны отобразиться первые 10 записей подряд (размер страницы 10).
Но в данном примере, когда в select передается '', то ничего не возвращается, притом, что
если прописать '' в самом запросе работает как надо. Я не стал возиться и нашел обходной путь
Т.к. в моем составном поле FULL_NAME по которому фильтруется всегда есть пробелы заменяю '' на ' ' и получаю нужный результат.
Может кто увидит в чем прикол/другое решение то напишите...


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
 <dx:ASPxComboBox ID="CustomerNameASPxComboBox" runat="server" ClientIDMode="AutoID" 
                    ClientInstanceName="CustomerNameASPxComboBox"  Width="100%"
                    CssFilePath="~/App_Themes/BlackGlass/{0}/styles.css" CssPostfix="BlackGlass" 
                    SpriteCssFilePath="~/App_Themes/BlackGlass/{0}/sprite.css" 
                    ValueType="System.Int32"
                    DropDownStyle="DropDown" ValueField="ID"
                    TextFormatString="{0} {1} {2}" EnableCallbackMode="True"  CallbackPageSize="10"
                   OnItemsRequestedByFilterCondition="ASPxComboBox_OnItemsRequestedByFilterCondition_SQL"
                    OnItemRequestedByValue="ASPxComboBox_OnItemRequestedByValue_SQL">
                    <Columns>
                        <dx:ListBoxColumn Caption="Фамилия" FieldName="LAST_NAME" />
                        <dx:ListBoxColumn Caption="Имя" FieldName="FIRST_NAME" />
                        <dx:ListBoxColumn Caption="Отчество" FieldName="MIDDLE_NAME" />
                        <dx:ListBoxColumn Caption="Адрес" FieldName="ADDRESS" Width="250px" />
                        <dx:ListBoxColumn Caption="Телефон" FieldName="PHONE" />
                        <dx:ListBoxColumn FieldName="ID" Width="0px" />
                    </Columns>
                    <LoadingPanelImage Url="~/App_Themes/BlackGlass/Editors/Loading.gif">
                    </LoadingPanelImage>
                    <ButtonStyle Width="11px">
                    </ButtonStyle>
                    <ValidationSettings ErrorText="Error has occurred">
                        <ErrorFrameStyle ImageSpacing="4px">
                            <ErrorTextPaddings PaddingLeft="4px" />
<ErrorTextPaddings PaddingLeft="4px"></ErrorTextPaddings>
                        </ErrorFrameStyle>
                    </ValidationSettings>
                    <ReadOnlyStyle BackColor="#D5DCE8">
                    </ReadOnlyStyle>
                </dx:ASPxComboBox>

<asp:SqlDataSource ID="ClientsSqlDataSource" runat="server" 
                            ConnectionString="<%$ ConnectionStrings:fbcs %>" 
                            ProviderName="<%$ ConnectionStrings:fbcs.ProviderName %>" >
</asp:SqlDataSource>



Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Windows.Forms;
using System.Data;
using System.Globalization;
using System.Drawing;
using DevExpress.XtraScheduler;
using DevExpress.Web.ASPxScheduler;
using DevExpress.Web.ASPxClasses;
using DevExpress.Web.ASPxEditors;

public partial class Test2_Cb : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void ASPxComboBox_OnItemRequestedByValue_SQL(object source, ListEditItemRequestedByValueEventArgs e)
    {
        long value = 0;
        if (e.Value == null || !Int64.TryParse(e.Value.ToString(), out value))
            return;
        ASPxComboBox comboBox = (ASPxComboBox)source;
        ClientsSqlDataSource.SelectCommand = @"SELECT *  
                                               FROM CLIENT c 
                                               WHERE (ID = @ID) ORDER BY full_name";

        ClientsSqlDataSource.SelectParameters.Clear();
        ClientsSqlDataSource.SelectParameters.Add("ID", TypeCode.Int64, e.Value.ToString());
        comboBox.DataSource = ClientsSqlDataSource;
        comboBox.DataBind();
    }

    protected void ASPxComboBox_OnItemsRequestedByFilterCondition_SQL(object source, ListEditItemsRequestedByFilterConditionEventArgs e)
    {
     
        ASPxComboBox comboBox = (ASPxComboBox)source;   
 
        ClientsSqlDataSource.SelectCommand =
               @"SELECT FIRST @rec_cnt SKIP @skip_rec
                    ID, FIRST_NAME, MIDDLE_NAME, LAST_NAME, ADDRESS, PHONE
                 FROM client c
                 where c.full_name CONTAINING @filter
                 order by c.full_name";

        ClientsSqlDataSource.SelectParameters.Clear();
        ClientsSqlDataSource.SelectParameters.Add("filter", TypeCode.String, string.IsNullOrEmpty(e.Filter) ? " " : e.Filter );
        ClientsSqlDataSource.SelectParameters.Add("skip_rec", TypeCode.Int64, e.BeginIndex.ToString());
        ClientsSqlDataSource.SelectParameters.Add("rec_cnt", TypeCode.Int64, (e.EndIndex - e.BeginIndex + 1).ToString());

        comboBox.DataSource = ClientsSqlDataSource;
        comboBox.DataBind();
    }
}
...
Рейтинг: 0 / 0
5 сообщений из 5, страница 1 из 1
Форумы / ASP.NET [игнор отключен] [закрыт для гостей] / SqlDatasource и тормоза на странице
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]