2014-10-01

Энтерпрайзнутые горе Java девелоперы

Пришлось разгребать тут один затык в производительности. Банальный просмотр некого списка объектов в системе страшно тупит, если у этого объекта есть несколько исторических записей и на странице выводится штук 200. (всего 1500 записей). Т.е. смешно мало.


Что делают гениальные "энтерпрайзнутые" Java EE горе-девелоперы:

0. Кто-то не очень гениальный догадался хранить последнюю версию объекта и его истории в одной и той же таблице: id, version, submit_date, description, some_data (CLOB). Да, для отображения списка CLOB не используется.
При такой структуре они постоянно вынуждены искать max(version) и потом выбирать данные последней версии. 

1. Выбираем список всех PK для последней версии:
select max(submit_date) submit_date, id, max(version) version from obj_table
group by id
order by submit_date desc;
!!! список отсортированный!!!

2. Создаем объект TreeMap - сортирует элементы по ключу по мере добавления их к Map. И!!! результат запроса запихиваем туда создавая ключ как submit_date.toString() + id.toString()
ыыы... т.е. сортировка в п.1 нам не понравилась.

3. Из TreeMap дергаем только значения (отсортированные) в ArrayList

4. Получившийся ArrayList реверсируем :) Collections.reverse :) Ну не понравился нам порядок.

5. Для всего найденного массива PK начинаем дергать объекты из базы. Ага - все таже табличка и  нам для списка нужены только поля таблицы. Тем не менее для каждого PK на текущей странице дергаем БД и создаем ValueObject. Потом для этого объекта дергаем все его версии, для каждой версии создаем объект и пихаем его к головной версии в список.
Внимание - some_data, кт. большой CLOB мы считываем и пихаем в память к объектам.

6. Получившийся список объектов скармливаем процедуре, кт. создает другой список таких же объектов, но не копируем some_data.

7. Только теперь анализируем какую страницу из всего списка объектов мы выводим на экран и формируем массив из объектов этой страницы.

8. Наконец, новый список объектов скармливаем JAXB для получения большого XML.

9. Получившийся XML скармливаем XSL и получаем страницу HTML кт. уже возвращаем клиенту.

На каждый переход между страницами повторяем с п.1

P.S. Еще молчу о бесконечной вложенности вызовов методов, содержимое кт. содержит вызов другого метода с небольшой модификацией параметров.