Меня попросили взглянуть на устаревшее приложение EJB3 со значительными проблемами производительности. Первоначальный автор больше недоступен, поэтому все, что у меня есть, это исходный код и некоторые комментарии пользователей относительно неприемлемой производительности. Мои личные навыки EJB3 довольно просты, я могу читать и понимать аннотированный код, но это все, пока не узнаю.
На сервере есть база данных, несколько bean-компонентов EJB3 (JPA) и несколько bean-компонентов без сохранения состояния только для того, чтобы разрешить CRUD для 4..5 объектов домена для удаленных клиентов. Сам клиент представляет собой java-приложение. Просто несколько подключены к серверу параллельно. Из комментариев пользователей я узнал, что
- клиент-серверное приложение хорошо зарекомендовало себя в локальной сети
- приложение было практически непригодно для использования в глобальной сети (1 Мбит или более), потому что операции чтения и обновления занимали слишком много времени (до нескольких минут)
Я видел одну потенциальную проблему: на всех EJB все отношения были определены со стратегией выборки FetchType.EAGER
. Объясняет ли это проблемы с производительностью операций чтения? Целесообразно ли начинать настройку со стратегий выборки?
Но это не объясняет проблемы с производительностью при операциях обновления, или нет? Обновление обрабатывается EntityManager
, клиент просто передает объект домена управляющему компоненту, а сохранение выполняется только с помощью manager.persist(obj)
. Возможно, объекты домена, отправляемые на сервер, слишком велики (возможно, это побочный эффект стратегии EAGER).
Итак, моя фактическая теория заключается в том, что слишком много байтов отправляется по довольно медленной сети, и мне следует подумать об уменьшении размера наборов результатов.
Исходя из вашего опыта, каковы типичные и наиболее распространенные ошибки кодирования, которые приводят к проблемам с производительностью в операциях CRUD, с чего мне следует начать исследование/оптимизацию?