2010-01-03 3 views
3

Удаленные вызовы EJB, выполненные с одного сервера приложений, всегда оптимизируются как локальные вызовы в памяти и являются сериализацией данных, пропущенных в этом сценарии?Вызов удаленного EJB3

Другими словами, действительно ли он работает с удаленными EJB все время, тем самым обеспечивая развязку между компонентами приложения, даже если два + EJB-модуля развернуты в одном контейнере? Я использую Glassfish.

Кроме того, если мне нужно выполнить поиск во время работы удаленных EJB (я не знаю JNDI-имя EJB до момента выполнения), что лучший способ кэшировать вызовы, используя как можно меньше накладных расходов на существующая инфраструктура EJB, предоставляемая сервером приложений (поэтому никаких дополнительных библиотек, таких как Guice, просто то, что уже предлагает Glassfish).

+0

Локальные интерфейсы EJB доступны только в том же * приложении * - не тот же * сервер приложений *. – Nate

+0

Правильно, точно. Итак, если вы хотите отделить части своего приложения, даже если модули находятся в одном и том же AS, вам все равно нужно использовать удаленные EJB, я не вижу другого способа. – bozo

ответ

3

Семантика аргументов удаленных служб отличается от семантики для локальных служб. Удаленные службы из-за их поведения в сериализации эффективно имеют семантику pass-by-value (т. Е. Аргументы копируются), тогда как локальные службы являются стандартными java pass-by-reference. Это больше, чем просто оценка производительности, она изменяет значение параметра.

Из-за этого я не думаю, что контейнер может оптимизировать вызов удаленного интерфейса EJB, как если бы он был локальным, из-за этой семантической разницы.

+0

Ну, я не понимаю, почему контейнер НЕ МОЖЕТ оптимизировать «локальный» вызов удаленного интерфейса EJB, на самом деле, я думаю, что я где-то читал его в документации Glassfish. В контейнере не хватает мозгов, чтобы понять это, пропустить сериализуемую часть и перейти с помощью pass-by-ref. Это кажется очень естественным. Проблема: у меня есть чрезвычайно несвязанная система JEE, которая запускает EJB, поскольку они необходимы во время выполнения (читая их описание из базы данных), и это все еще должно быть очень быстрым. Таким образом, вы можете добавить EJB во время выполнения, а время запуска «движка» приложения будет запускаться при необходимости. – bozo

+0

Потому что, когда вы пишете удаленный интерфейс, вы пишете его, ожидая семантики pass-by-value. Контейнер не может обойти изменение семантики в интересах производительности, это изменит * значение * этого. – skaffman

+0

На самом деле, вы можете сказать контейнеру об отправке, даже если вы используете удаленные интерфейсы в совместно расположенных модулях EJB. – bozo

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