Страница Visualforce работает, но не работает при внедрении [Слишком много строк запроса: 50001]

Я столкнулся со странной проблемой: у меня есть (довольно сложная) страница VisualForce, которой я передаю пару параметров при запуске. Эта страница работает нормально.

Example URL: https://force.com/apex/medicalforecast?t=SUMMARY&y=2013

Однако, если я встрою его в другую простую страницу visualforce со следующим кодом, я получу ошибку «System.LimitException: слишком много строк запроса: 50001».

<apex:page sidebar="false">
    <apex:include pageName="MedicalForecast" />
</apex:page>

Example URL: https://force.com/apex/Forecast?t=SUMMARY&y=2013

Кто-нибудь может объяснить такое поведение? Выполняются ли дополнительные запросы при встраивании одной страницы VisualForce в другую?

Спасибо


person Seb    schedule 04.02.2014    source источник


Ответы (1)


Прочтите http://www.salesforce.com/us/developer/docs/pages/Content/pages_controller_get_request.htm

особенно та часть:

  1. Вызываются методы конструктора в связанном пользовательском контроллере или классах расширений контроллера, создавая экземпляры объектов контроллера.
  2. Если страница содержит какие-либо пользовательские компоненты, они создаются и выполняются методы конструктора на любых связанных пользовательских контроллерах или расширениях контроллера.

Таким образом, при первом первоначальном запросе конструкторы (и геттеры) главной страницы и всех встроенных страниц/компонентов будут срабатывать для отображения начального состояния. Это означает, что все это одна транзакция, один контекст, и ограничение в 50 000 строк распределяется между ними.

Может быть, вы можете аннотировать свои страницы с помощью readonly="true" или попытаться сделать конструкторы тонкими (не тратя слишком много запросов). Поместите кнопку «извлечь данные» и метод действия — пользователю нужно будет сделать еще 1 щелчок, но это будет считаться отдельным действием = ограничение на новые 50 000 строк.

person eyescream    schedule 04.02.2014
comment
Привет. Спасибо за ответ, но я должен признать, что все еще немного сбит с толку. Страница, выполняющая встраивание, как показано выше, не имеет конструктора и не имеет запросов, которые она выполняет сама по себе. Вы говорите, что встроенная страница медицинского прогноза фактически создается дважды при загрузке страницы и, следовательно, достигает предела в 50 КБ? - person Seb; 04.02.2014
comment
Просто добавьте, что добавление readonly=true на страницу встраивания позволяет этому работать! Я все еще изо всех сил пытаюсь понять логику, связанную с двойным попаданием встроенного конструктора. - person Seb; 04.02.2014
comment
Трудно сказать, не видя вашего кода. Примените журнал отладки к своему пользователю и проверьте, какие запросы выполняются, сколько строк они возвращают в общей сложности... Но было бы странно, если бы на родительской странице не было никаких запросов. Это единственный <apex:include> на этой странице? И больше не используются вставки типа <c:componentName>, шаблоны и т.д.? - person eyescream; 04.02.2014
comment
Я попытался использовать журнал отладки, однако столкнулся с той же старой проблемой, когда код слишком сложен и быстро достигает предела вывода отладки. Родительская страница буквально вставлена ​​​​в мой исходный вопрос - 3 строки без конструктора - отсюда и мое замешательство! Цените помощь. - person Seb; 04.02.2014
comment
Понятия не имею, почему тогда они будут вести себя по-другому... Перейти к фильтрам журнала отладки, настроить все, что не связано с базой данных / SOQL / профилированием, повторить попытку? Это, конечно, с тем же пользователем или что-то в этом роде, поэтому логика выполняется одинаково? - person eyescream; 04.02.2014
comment
Я пробовал это - все равно выводит столько ненужной информации, что журнал отладки заполняет. Это с одним и тем же пользователем. Я думаю, что просто оставлю это, так как опция «Только для чтения» работает! Ваше здоровье - person Seb; 05.02.2014