JSF + без сохранения состояния EJB - PullRequest
1 голос
/ 11 сентября 2010

У меня есть приложение JSF 2.0, работающее на GlassFish v3. Он имеет EJB-компоненты, которые подают данные базы данных через JPA для основных сеансов приложений. Даже на сервере приложений не-IDE EJB-вызовы очень медленные. Между некоторыми страницами пользователь должен ждать более 10 секунд, чтобы перейти на следующую страницу.

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

Есть какие-нибудь подсказки?

Заранее спасибо, Daniel

РЕДАКТИРОВАТЬ Смотрите мой ответ для решения.

Ответы [ 3 ]

2 голосов
/ 11 сентября 2010

Трудно сказать без профилирования кода и / или модульного тестирования каждой части бизнес-логики, чтобы увидеть, какой именно шаг занимает столько времени.Моим первоначальным подозрением будет производительность БД.Возможно, таблица содержит миллион записей и плохо индексируется, что приводит к тому, что простой SELECT занимает много времени.Возможно, пропускная способность сети недостаточна, что приводит к тому, что для передачи данных требуется больше времени.

На данный момент, с учетом столь малой информации, это может быть все.Я бы просто профиль это.

1 голос
/ 15 сентября 2010

Раньше проблема была в том, что оба интерфейса Local и Remote были реализованы, и использовался только интерфейс Remote, однако в этом нет необходимости. Оба интерфейса имели одинаковые методы, чего следует избегать в соответствии с полученным предупреждением NetBeans:

Когда сессионный компонент имеет как удаленный, так и локальный бизнес-интерфейс, не должно быть никаких методов, общих для обоих интерфейсов.

Подробнее:

Семантика вызова удаленного бизнес-метода сильно отличается из этого метода местного бизнеса. По этой причине, когда сессионный компонент имеет как удаленный, так и локальный бизнес-метод, не должно быть метод, общий для обоих интерфейсов. Пример ниже - неправильное использование случай:

Remote public interface I1 { void foo();}
Local public interface I2 { void foo();}
Stateless public class Foo implements I1, I2 { ... }

Таким образом, решение состояло в том, чтобы удалить интерфейс Remote и настроить логику приложения на использование интерфейса Local.

1 голос
/ 12 сентября 2010

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

Вам необходимо предоставить более подробную информацию:

  • Используете ли вы интерфейсы Local или Remote?Находится ли клиент (веб-приложение) на удаленном компьютере?
  • Как получить доступ к EJB?Они вводятся?Вы выполняете поиск JNDI?
  • Что вы измерили?(либо во время профилирования, либо с использованием System.nanoTime() в различных точках)
  • Действительно ли меры показывают, что большая часть времени проводится в самом вызове?

Ответы на эти вопросы должны помочьопределить, где искать и возможные причины.

...