Клиент приложения <-> EJB звонки туда и обратно кажется медленным - PullRequest
1 голос
/ 04 января 2011

ОБНОВЛЕНИЕ: Как указал Престон, следующая проблема вполне может быть связана с (де) сериализацией объектов.Любые идеи о том, как оптимизировать это?


В настоящее время я исправляю некоторые вещи в старом приложении JavaEE.Он использует модуль EJB и клиентский модуль приложения.EJB обрабатывает все запросы к базе данных.Для этого примера рассмотрим метод getEnterprises(int year), который возвращает сущности «Предприятие» для данного года.В настоящее время это около 2500 записей.

Примечание: Я использую слово «Предприятия» только в иллюстративных целях.Классы реальных сущностей, вероятно, не будут иметь особого смысла для большинства;)

Теперь давайте предположим для этого примера, что сущность Enterprise имеет только два поля: code и name.Метод внутри удаленного компонента выглядит следующим образом:

public List<Enterprise> getEnterprises(int year){
    return em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
        .setParameter("year", year)
        .getResultList();
}

В клиенте приложения есть строка, подобная этой:

List<Enterprise> result = requestBean.getEnterprises(1996);

Мне кажется, это правильно.Что странно для меня, это то, что вызов на клиенте занимает около 15 секунд, чтобы завершить!Поэтому я добавил некоторые записи:

public List<Enterprise> getEnterprises(int year){
    logger.finest("Begin fetch on remote");
    List<Enterprise> output = em.createQuery("SELECT e FROM Enterprise e WHERE e.year=:year")
        .setParameter("year", year)
        .getResultList();
    logger.finest("End fetch on remote");
    return output;
}

и ...

logger.finest("Begin fetch on client");
List<Enterprise> result = requestBean.getEnterprises(1996);
logger.finest("End fetch on client");

Из полученных временных меток я понял, что вызов на сервере завершается менее чем за секунду, в то время как наклиенту это занимает более 15 секунд.

Пример рукописный след:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:00 | FINEST | Begin fetch on remote
2011-01-04 12:01 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

Итак, я предполагаю, что проблема заключается в клиенте / серверекоммуникации.Обратите внимание, что в приведенном выше примере я не проверял, является ли связь между клиентом и сервером медленной, или связь с сервером.Я понял, что журналы сервера показывают «ожидаемое» время выполнения, тогда как на клиенте оно вяло.Другими словами, это также может быть что-то вроде этого:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:15 | FINEST | Begin fetch on remote
2011-01-04 12:16 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

Или даже:

2011-01-04 12:00 | FINEST | Begin fetch on client
2011-01-04 12:07 | FINEST | Begin fetch on remote
2011-01-04 12:08 | FINEST | End fetch on remote
2011-01-04 12:17 | FINEST | End fetch on client

Я не столько копался в этом.

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

... о ... он работает на Glassfish, а для тестирования - на localhost.Так что сама сеть не проблема ...

Ответы [ 3 ]

2 голосов
/ 04 января 2011

Для всего, что связано с сетью, как это, мой первый порт захода должен работать, когда время на самом деле идет: Wireshark - ваш друг.Попробуйте сопоставить записи журнала с сетевым трафиком.Если между регистрацией сервера, когда он завершен, и данными, доставляемыми по сети, существует огромная задержка, вам следует изучить конфигурацию на стороне сервера и т. Д. Если данные были доставлены клиенту, но для метода требуется время.позвоните, чтобы завершить, посмотрите на клиента.Если данные передаются между сервером и клиентом медленно в течение этих 15 секунд, это может быть что-то совсем другое (и вам, возможно, придется взглянуть с обеих сторон).

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

1 голос
/ 04 января 2011

Чтобы клиент получил список, его необходимо сериализовать перед отправкой.Попробуйте сериализовать его на сервере, чтобы узнать, сколько времени это займет.Затем вычтите это время из ваших 15 секунд и посмотрите, не возникла ли у вас проблема.

1 голос
/ 04 января 2011

Если профиль выглядит как ваша вторая рукописная трассировка (медленное соединение, быстрый возврат), это может быть связано с поиском DNS. У меня недавно была похожая проблема - быстрый пинг, очень медленное соединение (45 с) с localhost. Добавление записей имен в / etc / hosts позволило мне быстро найти полное имя хоста.

...