Переработка Java-объектов XPage в SSJS

Я прочитал это предложение об утилизации объектов Domino: Как лучше всего переработать объекты Domino в Java Beans

Что лучше всего, если у меня есть источник данных с именем document и в функции, которая вызывается несколько раз, этот код существует:

var doc=document.getDocument(true)

и что-то делаем с внутренним документом.

Перед тем, как выйти из функции, следует ли мне переработать doc или мой внутренний документ будет переработан в источник данных?


person Peter    schedule 20.06.2013    source источник
comment
Обоснование утилизации состоит в том, чтобы высвободить использованные предметы. Это происходит автоматически, когда поток http завершает запрос. Существенным является циклическая переработка, что потребляет большее количество ограниченного количества объектов (ограничение составляет ~ 10 тыс. Дескрипторов для всего сервера Domino / клиента Notes). Таким образом, вы можете позволить себе не перерабатывать несколько документов, если только вы не вызываете свой код циклически. Остерегайтесь специальных объектов (дата / время, пользователь), привязанных к сеансу.   -  person Frantisek Kossuth    schedule 20.06.2013


Ответы (1)


Это отличный вопрос, потому что это одно из немногих исключений из принципа «перезагружать все» (два других примечательных примера: вы должны никогда не перезапускать текущий сеанс или база данных). Это плохая идея - повторно использовать внутренний документ для источника данных, потому что жизненный цикл JSF получает тот же дескриптор, и вы бы переработали его из-под Domino. Источник данных позаботится об этом за нас, поэтому нет необходимости перерабатывать его вручную. С другой стороны, если вы получаете указатель на определенные элементы (например, doc.getFirstItem("someFieldName") или значения элементов, которые являются датами, вам следует повторно использовать эти объекты, а не сам документ.

Безусловно, наиболее важным сценарием, в котором критически важно повторно использовать объекты Java и SSJS, является итерация просмотра, потому что каждый раз, когда вы переходите к следующей записи или документу, вы теряете дескриптор, если пропускаете переработку. В большинстве других случаев переработка по-прежнему рекомендуется, но ближе к тому, чтобы быть необязательной, потому что для других операций требуется много времени, чтобы протечь настолько, чтобы вызвать проблемы. Но если вы выполняете итерацию очень большого представления, у вас могут легко закончиться ручки за одну итерацию, если вы забудете переработать.

Однако одна напутственная мысль: я редко вижу ситуацию, когда получение дескриптора внутреннего документа источника данных является лучшим подходом, поэтому я бы рекомендовал пересмотреть ваш код, чтобы убедиться, что для начала даже необходимо получить этот дескриптор. . Например, вместо document.getDocument(true).getItemValueString("someFieldName") просто вызовите document.getValue("someFieldName"). Возвращаемое значение должно быть идентичным, но оно будет работать более эффективно, и вы не прикасаетесь к внутреннему документу, поэтому переработка не является проблемой. И при каждом доступе к элементу требуется меньше печатать, что, безусловно, со временем накапливается. Аналогичным образом вместо document.getDocument(true).replaceItemValue("someFieldName", "newValue") подставьте document.setValue("someFieldName", "newValue").

person Tim Tripcony    schedule 20.06.2013