Показаны сообщения с ярлыком ИТ. Показать все сообщения
Показаны сообщения с ярлыком ИТ. Показать все сообщения

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. Еще молчу о бесконечной вложенности вызовов методов, содержимое кт. содержит вызов другого метода с небольшой модификацией параметров.

2010-06-01

Загадочные конструкции в коде

Часто занимаюсь отладкой и чтением чужого кода. Иногда попадаются странные куски. Буду наверное публиковать, а то потом забывается.
- nvl(vStr, '') - между кавычками пробела нет!
- select ... from... where nvl(vNum, 1) = 0 - чем не понравилось сравнивать сразу с 0м непонятно, зато усложнили работу оптимизатора в борьбе с null-ами
- if trunc(abs(vSum)*100)/100 != 0 then - долго ломал голову, пока Amd не подсказал. Тут замаскировано: abs(vSum) < 0.01

2010-02-12

Ик, ик, проблема 2000 года!

Невероятно, все еще существуют системы, в которых не решена проблема 2000 года. В нашей новой замечательной Банковской Системе во многих местах все еще только две цифры на ввод года. Отлично отработало поле ввода даты рождения клиента. Получили дату рождения в 2056 году, например. :) Человек еще не родился, а уже пришел валюту менять. Назад в будущее!

2010-01-20

Куда катится новое поколение ИТшников?

Дожили... приходит студент на собеседование:
...Компьютер дома есть? - Есть.
- Что такое "backup"? - ээээ... back - назад, up - вверх... ха-ха... не знаю.
- Ночами приходилось работать? - Ну да, отладкой программ занимался...
- Каких программ? - Ну вычислительных программ...
- Так ты еще и программист? - ну как... частично да...
- Какие языки программирования знаешь - Ну Delphi, веб-сайты делали на курсах...

2009-12-14

Пропал Wi-Fi


Очень неожиданно сдох домашний Wi-Fi. D-Link DI-624+ больше не подает признаков жизни. Отслужил где-то 5-6 лет. Теперь осталось выяснить - что же с ним. Вскрытие покажет!

2009-11-30

Телефон спасает грызуна

Дожили, не нашел дома запасной батарейки (АА) для беспроводной мыши. Выручила старенькая DECT-трубка Panasonic, в которой есть аж два АА-аккумулятора. Все-равно домашним телефоном не пользуемся :) Получилась зарядка аккумуляторов для мыши. ;)