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