Можно ли хранить большие объекты (например, компонент Java) в переменной приложения? - PullRequest
6 голосов
/ 17 мая 2010

Я сейчас занимаюсь разработкой приложения, которое создает и сохраняет соединение с локальным XMPP-сервером в области приложения. Методы подключения хранятся в cfc, который гарантирует, что Application.XMPPConnection подключается и авторизуется каждый раз, когда он используется, и использует соединение для отправки живых событий пользователям. Насколько я могу сказать, это работает нормально. НО это не было проверено под любым видом напряжения.

У меня такой вопрос: Будет ли эта установка вызывать проблемы позже? Я спрашиваю только потому, что не могу найти свидетельства того, что другие люди используют переменные приложения таким образом. Если бы я не использовал railo, я бы использовал шлюз событий CF вместо того, чтобы выполнить ту же задачу.

Ответы [ 2 ]

7 голосов
/ 17 мая 2010

Размер сам по себе не проблема. Если бы вы инициализировали один объект для каждого запроса, вы бы записали намного больше памяти. Проблема в доступе.

Если у вас большое количество запросов, конкурирующих за один и тот же объект, вам нужно измерить время доступа к этому объекту и его реализацию. Имейте в виду, что для объектов данных их может прочитать более одного потока. Однако я понимаю, что когда вызывается функция объекта, он блокирует этот объект для других потоков, пока функция не вернется.

Кроме того, если объект поддерживает состояние, вам нужно подумать, что делать, когда несколько потоков получают / устанавливают эти данные. Будете ли вы в конечном итоге с условиями гонки?

Вы можете рассмотреть возможность обработки этого объекта в области сеанса, чтобы он создавался только для пользователя (который, скорее всего, сделает только один или два одновременных запроса).

3 голосов
/ 17 мая 2010

Конечно, вы можете использовать область приложения для хранения этих компонентов, если они используются всеми пользователями в разных частях приложения. Теперь возможные проблемы:

  1. размер компонента (ов)
  2. время, необходимое для инициализации, если они установлены во время запуска приложения
  3. условия гонки между установкой / получением состояний этих компонентов

Во-первых, есть способы расчета размера компонента в памяти. В последнее время было много сообщений на эту тему, так что было бы легко найти некоторые. Если у вас нет большой структуры или запроса, сохраненного внутри, я думаю, вы в порядке здесь.

Во-вторых, опять же, если вы не заполняете этот cfc каким-то большим запросом из БД или выполняете медленный синтаксический анализ, вы тоже здесь в порядке.

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

...