2014-07-16 1 views
0

Я был довольно строгим в области переработки объектов Notes, но я столкнулся с ситуацией, когда я не могу перерабатывать объект, потому что он передается обратно от метода к вызову код. Таким образом, в классе у меня есть этот код:Проблема object.recycle, и когда это сделать

public Database getAppDB() { 
      Database appDB = null; 
      try{ 
       Session s = ExtLibUtil.getCurrentSession(); 
       serverName = s.createName(s.getCurrentDatabase().getServer()).getCommon(); 
       appDB = s.getDbDirectory(serverName).openDatabaseByReplicaID(this.getAppRepID()); 
       return appDB; 
      }catch (NotesException e){ 
       System.out.println(e.toString()); 
       return appDB; 
      }finally{ 
       Utils.recycleObjects(s); 
      } 

     } 

Какой openes базу данных затем передает AppDB обратно в вызывающую программу. Очевидно, что если я создам базу данных в своей вызывающей программе, мне нужно ее переработать, но в этом методе класса я не могу ее переработать, потому что она возвращается. Я создаю тикающую бомбу замедленного действия с этим? Если это так? Этот метод можно было бы назвать сотнями раз в течение жизненного цикла сеанса.

+0

Просто для любопытства - что находится в getAppRepID()? –

+0

Этот метод является частью класса AppProperties, который хранится в HashMap строки типа, объекта <имя_пользователя, AppProperties>. HashMap сохраняет одно или несколько определений приложений (см. Http://stackoverflow.com/questions/24746448/addition-to -managed-bean-best-practice) Таким образом, getAppRepID получает значение текущей версии репликации базы данных приложений. класс AppProperties хранит несколько фрагментов информации о каждом приложении, которое можно вызывать из основной БД. Используя этот метод, я могу повторно использовать большинство моих XPages и Custom Controls. 90% дизайна приложений распространено в основной БД. –

ответ

5

Просто: код, вызывающий ваш метод, отвечает за переработку объекта базы данных. Это правило распространяется и на код SSJS!

Вы также не должны перерабатывать сеанс, поскольку он перерабатывает весь объект, полученный из него.

3

Сессия перерабатывается в конце каждого запроса и вместе с ней все потомки (база данных, представление, документ и т. Д.). Я только склонен перерабатывать документы или ViewEntries в циклах и DateTimes. Другое дело, чтобы переработать, если вы используете .getColumnValues ​​(), передайте это в вектор и переработайте значения столбца с помощью Session.recycle (Vector). Даже если вы получаете только одно значение столбца, оно получает все. Поэтому, если у вас есть столбец даты, который создается как DateTime и единственный способ его переработки, это с Session.recycle (Vector). Не путайте это с Session.recycle, который перерабатывает сам сеанс. См. http://www.intec.co.uk/go-green-and-recycle-the-important-information-any-non-java-xpages-dev-needs-to-know/

Теперь мой предпочтительный метод утилизации - использовать API OpenNTF Domino и позволить ему перерабатывать меня.

+0

Итак, если я делаю это в JAVA: private Vector colVal; ..... colVal = ve.getColumnValues ​​(); .... session.recycle (colVal); Затем мне нужно сделать перезагрузку сеанса. То же самое относится к SSJS? –

+0

Вам не нужно будет перерабатывать сам сеанс. И да, то же самое справедливо для SSJS –

+0

Действительно удивительно, что проблема утилизации почти полностью отсутствует в документации IBM. Я никогда не видел session.recycle (объект). Я нашел несколько экземпляров в моем коде, поскольку это могло быть катастрофическим, однако в некоторых SSJS у меня есть этот код в качестве значений для поля со списком: var rtn: Array = database.getView ("vwWFSApplications"). GetColumnValues ​​(0) ; return rtn.unshift (""); Основываясь на том, что вы сказали, я должен сделать session.recycle (rtn), но это возвращаемое значение и будет потеряно. В этом конкретном случае все значения столбцов являются только String, но ..... –

0

Хотя его отличная идея быть строгим в отношении вызовов .recycle(), в этом случае это вряд ли имеет значение. Независимо от того, сколько раз вы вызываете эту процедуру, если getAppRepID возвращает один и тот же идентификатор репликации, вы будете продолжать привязывать базу данных к тому же дескриптору C++. Таким образом, наибольшее количество открытых дескрипторов, которые вы могли бы получить, - это любое количество записей, которые у вас есть на вашей карте. Как только операция будет завершена, и сеанс будет переработан, все обработчики базы данных, которые он также будет переработаны, также будут переработаны.

Учитывая, что количество обработчиков C++, разрешенных на большинстве серверных ОС, в настоящее время составляет около 180 000, вы, вероятно, будете в безопасности при масштабировании. Это составляет 180 000 для всех одновременных запросов, поэтому, если этот процесс происходит одновременно для 1000 пользовательских запросов, и вы кладете 200 баз данных на карту, у вас будут проблемы, но я предполагаю, что это маловероятно.

ИЛИ Вы можете просто использовать API-интерфейс OpenNTF Domino, который полностью устранит эту проблему и позволит вам удалить каждый вызов .recycle() в вашем коде.

Смежные вопросы