2010-05-17 1 views
6

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

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

ответ

7

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

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

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

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

+0

спасибо за ответы. мне может потребоваться рассмотреть сценарий нескольких потоков, обращающихся к объекту, но я думаю, что его настройка прямо сейчас довольно хороша. единственным объектом, который хранится в области приложения и общим для всех пользователей, является объект соединения XMPP (созданный библиотекой Smack). он призван отправлять очень быстрые команды xmpp локальному серверу openfire. может ли тэг помочь? –

+0

Представьте 500 запросов в очереди, ожидая, пока одно соединение будет бесплатным. (Если вы используете cflock.) В зависимости от различных факторов это может вызвать огромное узкое место. –

+0

Даже если CFLOCK не используется (он в основном устарел) CF является потокобезопасным, так как MX (6). Множество потоков, просматривающих одно и то же местоположение данных, не нужно ждать, но вызывающие функции вызовут их очередь. По крайней мере, это мое понимание. –

3

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

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

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

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

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

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