Слава + Паша. Часть 7. Первые гости

– Представляем гостя
– Фидбек от Славы на последний эпизод
– Программист как синий воротничок
– Зависимости
– code review in scale (https://www.youtube.com/watch?v=2F6J82-Ch88)
– Улучшения в Java 9 для контейнеров
– Жизнь без GC
– danger (http://danger.systems)

Слава + Паша. Часть 5. Разное

  1. final
  2. Длинные названия переменных
  3. hibernate/JPA
  4. Actuator logs in spring Boot 1.5.1
  5. k8s в действии
  6. Оптимизация?
  7. JDBC и connection pooling
  8. Как Слава программера продавал
  9. Оффтоп

Паша + Слава. Часть 4.

  • Проблемы на бюджетных хостингах
  • Letsencrypt
  • Так и не стали фанатами Макоси
  • А с линуксом норм
  • Люди не знают Git. Но как?
  • Люди ломают гит — как им помогать?
  • Новая работа Слава — более низкоуровневая
  • Rkt выглядит как сырое поделие
  • Немножко про внутренности kubernetes
  • Как работать с k8s разработчикам…
  • А Go-то всё ещё не айс

В плане звука у нас сегодня четвёртый день комом — меня в первой половине подкаста слышно так себе

Паша + Слава, часть 3.

  • Ceph
  • коммит в Thrift
  • мой переход в другую комманду
  • как я раст ковыряю
    • проблемы со строками
    • заимствование
    • попробовал атом
    • Display/Debug, Derive
    • размеры типов (трейты и реальные типы)

Если JPA тормозит

За то относительно большое время, которое я занимаюсь enterprise-разработкой я достаточно много раз сталкивался с утверждением что Hibernate использовать нельзя, потому что он тормозит. И правда, этот фреймворк может тормозить если его неправильно готовить. Научиться готовить его идеально — не самая простая задача, но достаточно просто избежать типовых ошибок, окторые просто совершить и сложно найти не зная где и что искать. Вообще-то конечно же всё написано в референсе и в паре замечательных книжек типа Java Persistence with Hibernate. Но не у всех и не всегда есть потребность и возможность их читать. Поэтому я решил написать несколько простых правил, которые следует соблюдать чтобы избежать самых популярных ошибок.
Чеклист того, что надо сделать, если вы по какой-либо причине считаете, что ваше приложение с использованием Hibernate тормозит.
  • Все List<> заменить на Set<>
    • Just like value type collections, unidirectional bags are not as efficient when it comes to modifying the collection structure (removing or reshuffling elements). Because the parent-side cannot uniquely identify each individual child, Hibernate might delete all child table rows associated with the parent entity and re-add them according to the current collection state.
    • When using sets, it’s very important to supply proper equals/hashCode implementations for child entities. In the absence of a custom equals/hashCode implementation logic, Hibernate will use the default Java reference-based object equality which might render unexpected results when mixing detached and managed object instances.
  • Написать кастомные equals и hashCode.
    • Если у обеих сравниваемых сущностей есть id и он одинаковый — сущности одинаковые. Если у обеих нет — сравнивать по контенту.
  • Проверить все маппинги. Lazy должны быть все *ToMany, если только вы не уверены в обратном.
    • Если при этом у вас падают ошибки с LazyInitializationException — вы неправилно работаете с транзакциями. Исправляйте.
    • Если *ToOne можно сделать ленивыми — делайте. Нечего плодить запросы к БД на пустом месте.
  • Убедиться что мы нигде не получаем полную сущность только для того чтобы её обновить. Если такое происходит — заменить на EntityManager#getReference
  • Убедиться что во всех JPQL запросах мы получаем не Entity, а DTO. Это делается с помощью “SELECT NEW”
  • Всюду где не уверены что действие совсем простое — используйте JPQL/HQL/Criteria API/QueryDSL.