Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Сохранение Oracle Ref Cursor в сессии ASP.NET / 11 сообщений из 11, страница 1 из 1
25.09.2008, 10:48
    #35558757
alex7000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
Доброго времени суток. Нужно решить такую задачу.
Разрабатывается приложение ASP.NET, которое работает с Oracle посредством ODP.NET 11g.
Задача заключается в следующем:
Основная цель - повышение производительности приложения при выборе
большого кол-ва записей из БД.
Данные отображаются в табличном виде (Devexpress ASPxGridView). Основная идея состоит в том, чтобы организовать постраничный просмотр данных в гриде используя Ref Cursor, сохраняя соединение с БД и Ref Cursor в сесси ASP.NET (Сессия ASP.NET работает в режиме InProc) на все время работы пользователя с таблицей, на которую ссылается курсор.

Пользователь открывает некоторую страницу ASP.NET, на которой содержится грид
представляющий данные определённой таблицы в БД. При первом обращении к странице ASP.NET, мы вызываем хранимую процедуру Oracle, которая возвращает Ref Cursor. Далее мы выбираем некоторое кол-во записей и привязываем их к гриду. Сохраняем соединение с БД и Ref Cursor в сессии ASP.NET. При запросе пользователя отобразить следующую порцию данных (переходим на следующую страницу грида) мы восстанавливаем из сессии объекты соединения с БД и Ref Cursor,
и выбираем следующие записи. И т.д. пока пользователь не выберет все записи или не закончит работу.
Мы попробовали реализовать такой вариант и столкнулись с проблемой:
При первом запросе все проходит нормально. при втором, после восстановления объектов
из сессии и попытке произвести выборку записей через Ref Cursor, выдается ошибка -
Выполнение данной операции (выборки данных из курсора) невозможно из-за текущего состояния объекта (т.е. Ref Cursor). Таким образом мы получили следующие выводы:
1) объект соединения с БД можно сохранять в сессии и спокойно работать с ним, как в толстом клиенте, удерживая его столько, сколько нам нужно и используя его между запросами страницы ASP.NET в рамках сессии ASP.NET;
2) а вот объект Ref Cursor сохранить в сессии и испозовать его между запросами страницы ASP.NET у нас не получилось;

Просьба помочь разобраться, можно ли работать с Ref Cursor в таком режиме. Нам принципиально важно держать открытый курсор на протяжении всего промежутка времени, пока пользователь работает с данными конкретной таблицы, на которую ссылается курсор.
Спасибо.
...
Рейтинг: 0 / 0
25.09.2008, 10:55
    #35558784
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
alex7000Просьба помочь разобраться, можно ли работать с Ref Cursor в таком режиме.
Нет.
alex7000
Нам принципиально важно держать открытый курсор на протяжении всего промежутка времени, пока пользователь работает с данными конкретной таблицы, на которую ссылается курсор.
Аргументы будут?
...
Рейтинг: 0 / 0
25.09.2008, 11:31
    #35558910
alex7000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
По поводу аргументов могу сказать следующее:
1) Приходится работать с таблицами содержащими миллионы записей;
2) Пользователей может быть порядка 5000;
3) Таким образом, если мы всякий раз, когда пользователь захочет посмотреть
следующую страницу в гриде, будем открывать заново курсор и переходить на позицию, на
которой остановился пользователь, наше приложение в лучшем случае будет иметь
очень большое время отклика.
...
Рейтинг: 0 / 0
25.09.2008, 11:39
    #35558930
Нахлобуч
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
alex7000Таким образом, если мы всякий раз, когда пользователь захочет посмотреть
следующую страницу в гриде, будем открывать заново курсор и переходить на позицию, на
которой остановился пользователь, наше приложение в лучшем случае будет иметь
очень большое время отклика.
Вот это "таким образом" основано на умозрительных рассуждениях или на данных профайлера? К тому же, как думаешь, не умрет ли БД от 5000 открытых курсоров?
...
Рейтинг: 0 / 0
25.09.2008, 11:50
    #35558973
зы
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
а зачем открывать курсор чтобы считать страницу?
...
Рейтинг: 0 / 0
25.09.2008, 12:20
    #35559065
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
Для Вашей задачи нужно смотреть в сторону кеширования данных.
Но не упадет ли бедное приложение от переизбытка данных в кешах?
Хотели понизить ресурсы SQL-сервера, зато прибъете несчастное приложение. Клин клином вышибают?
Выход - не выдумывать всякую ересь, а пользоваться нормальным пейджингом. Обратился клиент за порцией данных - дайте ему их. А непонятного происхождения велосипедные идеи нужно прятать. И никому не показывать.
...
Рейтинг: 0 / 0
25.09.2008, 12:39
    #35559139
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
Для Вашей задачи нужно смотреть в сторону кеширования данных.
Но не упадет ли бедное приложение от переизбытка данных в кешах?
Хотели понизить ресурсы SQL-сервера, зато прибъете несчастное приложение. Клин клином вышибают?
Выход - не выдумывать всякую ересь, а пользоваться нормальным пейджингом. Обратился клиент за порцией данных - дайте ему их. А непонятного происхождения велосипедные идеи нужно прятать. И никому не показывать.
...
Рейтинг: 0 / 0
25.09.2008, 13:23
    #35559296
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
НахлобучК тому же, как думаешь, не умрет ли БД от 5000 открытых курсоров?
БД просто выкинет болт при превышении количества открытых курсоров - в оракле есть такая настройка, при превышении числа вылетает ORA-01000: maximum open cursors exceeded. Кроме того, хранение ref cursor все равно не спасет от накладных расходов на фетчинг. Автору можно посоветовать не использовать литеральный SQL - только параметризованный, следствием чего будет являться отсутствие хард-парсинга на одинаковых запросах, плюс оптимизация самих запросов. Ну, еще можно посоветовать всю выборку данных перенести на сервер БД, чтобы минимизировать затраты на переключение контекста, использовать BULK COLLECT (потому как row by row is slow by slow), и, наконец, завернуть всё это дело в pipelined-функцию, которая бы отдавала данные порциями по мере обработки, а не все скопом по окончании обработки.
...
Рейтинг: 0 / 0
25.09.2008, 14:19
    #35559548
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
Ъй
Так pipelined-функция и так отработает весь фетч на сервере, а клиент возьмет уже сформированный набор.
Типа того:
Код: plaintext
1.
2.
3.
...
   loop
      pipe row (данные);
   end loop;
...
Рейтинг: 0 / 0
25.09.2008, 14:28
    #35559576
Ъй
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
МСУ Ъй
Так pipelined-функция и так отработает весь фетч на сервере, а клиент возьмет уже сформированный набор.
Типа того:
Код: plaintext
1.
2.
3.
...
   loop
      pipe row (данные);
   end loop;

Правильно - bulk collect'ом в коллекцию. Но ее надо будет передать клиенту - а что ни оракл не знает про дотнетовские DataTable, что ни дотнет про оракловые коллекции (ассоциативные массивы). Вариант впихнуть данные в XML чреват опять-таки возвратом после обработки всех данных, поэтому данные придется отдавать построчно - тут pipelined и будет работать.
...
Рейтинг: 0 / 0
25.09.2008, 14:33
    #35559597
МСУ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Сохранение Oracle Ref Cursor в сессии ASP.NET
Ъйданные придется отдавать построчно
Не, велосипед еще тот. Точнее, грабли.
...
Рейтинг: 0 / 0
Форумы / ADO.NET, LINQ, Entity Framework, NHibernate, DAL, ORM [игнор отключен] [закрыт для гостей] / Сохранение Oracle Ref Cursor в сессии ASP.NET / 11 сообщений из 11, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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