Труднощі написання Віжуелфорс пейджі, або: що робити, якщо розмір колекції перевищує ліміт?

Скільки рекордів-об'єктів доцільно показувати на віжуал форс пейджі? Очевидно, менше, ніж 1000.

Ґавернор лімітс або комендантські ліміти — це, як всім відомо, найбільший камінь спотикання у системі сейлзфорс, це те, що всі розробники з люттю ненавидять.

Не зважаючи на те, що серед списку лімітів такий ліміт як «розмір колекції перевищує ліміт 1000 записів» не зазначений

(http://www.salesforce.com/us/developer/docs/apexcode/Content/apex\_gov\_limits.htm),

однак він існує, і забороняє розмістити наприклад, 1001 запис в одному елементі пейджБлокСекшин — блоковій секції сторінки.

Цей ліміт створює великі незручності, тому в інтернеті є багато різних тредів, де люди запитують проте, як з цим боротися. Загалом відповідь одна — показувати максимум 1000 записів.

Отож, я вирішив вчинити так, як радять, і обмежив кількість записів, що показувалась до 1000.

Однак, виявилося, що мій сейлзфорс обджект досить масивний, і 1000 записів-рекордів таких об'єктів важать більше, ніж 15 метрів, і от я зіткнувся зі ще одним прихованим комендантським лімітом.

Обсяг відповіді перевищує ліміт організації у 15 Мб.

«Та ну його, цей сейлзфорс з його лімітами», — подумав я, і вирішив обмежити кількість записів до півтисячі.

Однак, виявилося, що навіть цього недостатньо аби сторінка відобразилася без помилок з нав'язливими повідомлення про перевищення комендантських лімітів.

Максимальний обсяг контейнера 135 Кб перевищено. Актуальний об'єм контейнера для цієї сторінки був 166.203 Kб.

Вирішив я обмежити кількість записів до 250.

Але при перезавантаженні сторінки з ймовірністю одна друга я бачив помилку з повідомленням про те, що перевищено ліміт часу виконання процесора.

Тож потім я обмежив кількість записів до 200, і нарешті сторінка почала працювати більш-менш нормально.

Інше питання — це про пейджинацію, тобто, що робити, якщо юзеру таки важливо побачити всі 3000 записів? Насправді, сейлзфорсівська мова запитів сейлзфорсівських об'єктів нібито має такий параметр як зміщення (офсет www.salesforce.com/us/developer/docs/soql_sosl/Content/sforce_api_calls_soql_select_offset.htm). Однак цей параметр не може набувати значення більшого за 2000. Тому, якщо в мене наприклад, 3000 записів, і я хочу показати юзеру останню пачку записів, скажімо, від 2801 до 3000, то я на жаль не можу скористатися таким надзвичайно зручним параметром. Тому доводилося ритися в неті і знайти якусь кастомну реалізацію пейджинації. В якій спочатку витягуються тільки всі айдішки усіх рекордів, які нам треба (надіємося, що кількість записів загалом менша, ніж 50000, бо інакше ми втикнемся в інший сейлзфорсівський комендантський ліміт). Коли витягувати тільки айдішки, такий сок'юель виконується досить швидко. Якщо ж витягувати усі поля, які нас цікавлять, то це може бути надовго. Потім формується множина айдішок тих рекордів, які нам треба показати на поточній пейджі з поточним зміщенням, наприклад, 2801. І вже після того витягуються 200 рекордів зі всіма полями, якщо витягувати тільки 200 рекордів зі всіма полями, це теж не дуже довго виконується.

Така то історія, що доводиться робити розробникам, якщо розмір колекції перевищує сейлзфорсівський ліміт.

Схожі публікації
© 2009 - 2020, Розробка - соціальна ІТ спільнота.
Контакти: info@rozrobka.com
Правила користування