|
|
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
Доброго времени суток. Нужно решить такую задачу. Разрабатывается приложение 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 в таком режиме. Нам принципиально важно держать открытый курсор на протяжении всего промежутка времени, пока пользователь работает с данными конкретной таблицы, на которую ссылается курсор. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 10:48 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
alex7000Просьба помочь разобраться, можно ли работать с Ref Cursor в таком режиме. Нет. alex7000 Нам принципиально важно держать открытый курсор на протяжении всего промежутка времени, пока пользователь работает с данными конкретной таблицы, на которую ссылается курсор. Аргументы будут? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 10:55 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
По поводу аргументов могу сказать следующее: 1) Приходится работать с таблицами содержащими миллионы записей; 2) Пользователей может быть порядка 5000; 3) Таким образом, если мы всякий раз, когда пользователь захочет посмотреть следующую страницу в гриде, будем открывать заново курсор и переходить на позицию, на которой остановился пользователь, наше приложение в лучшем случае будет иметь очень большое время отклика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 11:31 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
alex7000Таким образом, если мы всякий раз, когда пользователь захочет посмотреть следующую страницу в гриде, будем открывать заново курсор и переходить на позицию, на которой остановился пользователь, наше приложение в лучшем случае будет иметь очень большое время отклика. Вот это "таким образом" основано на умозрительных рассуждениях или на данных профайлера? К тому же, как думаешь, не умрет ли БД от 5000 открытых курсоров? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 11:39 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
а зачем открывать курсор чтобы считать страницу? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 11:50 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
Для Вашей задачи нужно смотреть в сторону кеширования данных. Но не упадет ли бедное приложение от переизбытка данных в кешах? Хотели понизить ресурсы SQL-сервера, зато прибъете несчастное приложение. Клин клином вышибают? Выход - не выдумывать всякую ересь, а пользоваться нормальным пейджингом. Обратился клиент за порцией данных - дайте ему их. А непонятного происхождения велосипедные идеи нужно прятать. И никому не показывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 12:20 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
Для Вашей задачи нужно смотреть в сторону кеширования данных. Но не упадет ли бедное приложение от переизбытка данных в кешах? Хотели понизить ресурсы SQL-сервера, зато прибъете несчастное приложение. Клин клином вышибают? Выход - не выдумывать всякую ересь, а пользоваться нормальным пейджингом. Обратился клиент за порцией данных - дайте ему их. А непонятного происхождения велосипедные идеи нужно прятать. И никому не показывать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 12:39 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
НахлобучК тому же, как думаешь, не умрет ли БД от 5000 открытых курсоров? БД просто выкинет болт при превышении количества открытых курсоров - в оракле есть такая настройка, при превышении числа вылетает ORA-01000: maximum open cursors exceeded. Кроме того, хранение ref cursor все равно не спасет от накладных расходов на фетчинг. Автору можно посоветовать не использовать литеральный SQL - только параметризованный, следствием чего будет являться отсутствие хард-парсинга на одинаковых запросах, плюс оптимизация самих запросов. Ну, еще можно посоветовать всю выборку данных перенести на сервер БД, чтобы минимизировать затраты на переключение контекста, использовать BULK COLLECT (потому как row by row is slow by slow), и, наконец, завернуть всё это дело в pipelined-функцию, которая бы отдавала данные порциями по мере обработки, а не все скопом по окончании обработки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 13:23 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
Ъй Так pipelined-функция и так отработает весь фетч на сервере, а клиент возьмет уже сформированный набор. Типа того: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 14:19 |
|
||
|
Сохранение Oracle Ref Cursor в сессии ASP.NET
|
|||
|---|---|---|---|
|
#18+
МСУ Ъй Так pipelined-функция и так отработает весь фетч на сервере, а клиент возьмет уже сформированный набор. Типа того: Код: plaintext 1. 2. 3. Правильно - bulk collect'ом в коллекцию. Но ее надо будет передать клиенту - а что ни оракл не знает про дотнетовские DataTable, что ни дотнет про оракловые коллекции (ассоциативные массивы). Вариант впихнуть данные в XML чреват опять-таки возвратом после обработки всех данных, поэтому данные придется отдавать построчно - тут pipelined и будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.09.2008, 14:28 |
|
||
|
|

start [/forum/topic.php?desktop=1&fid=17&tid=1352135]: |
0ms |
get settings: |
6ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
52ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
29ms |
get tp. blocked users: |
1ms |
| others: | 201ms |
| total: | 315ms |

| 0 / 0 |
