CountDownLatch

В этой статье рассмотрим CountDownLatch. В отличие от CyclicBarrier, где все потоки равноправны и ожидают друг друга, с CountDownLatch потоки делятся на два типа — одни уменьшают значение CountDownLatch, а другие ждут, когда он станет равен 0, чтобы продолжиться.
Читать далее «CountDownLatch»

ResultTransformer для получения проекции ManyToMany (пример на Hibernate и Spring Boot)

Здесь напишем более сложный ResultTransformer, чем в предыдущем примере. Помимо коллекции @OneToMany сущность будет содержать еще коллекцию @ManyToMany.

Кроме того, попробуем получить результат еще одним способом — без ResultTransformer, а с помощью операций над Stream.
Читать далее «ResultTransformer для получения проекции ManyToMany (пример на Hibernate и Spring Boot)»

Transaction Propagation

В этой статье рассмотрим настройку propagation аннотации @Transactional. Аннотация @Transactional (без настроек) заставляет метод выполняться в рамках транзакции.
Читать далее «Transaction Propagation»

@Transactional, уровни изоляции

В этой статье рассмотрим уровни изоляции на примере задачи: написать веб-приложение с одной веб-страницей, которое выдает число обращений к ней (или хитов).
Читать далее «@Transactional, уровни изоляции»

Запрет на Dirty Write

Уровни изоляции касаются того, что видит транзакция. Но независимо от того, что она видит, всегда есть запрет на Dirty Write — на модификацию записи, которая параллельно изменяется другой транзакцией.

То есть если одна транзакция уже успела вызвать update или delete, то параллельная транзакция приостанавливается при попытке выполнить свой update/delete  и ждет завершения первой транзакции.
Читать далее «Запрет на Dirty Write»

Введение в QueryDSL

Есть несколько способов составить JPA-запрос, среди них — неудобный JPA Criteria API. Все признают, что запросы, составленные таким способом, плохо читаются. Как альтернатива появилась библиотека QueryDSL — она гораздо удобнее.
Читать далее «Введение в QueryDSL»

Аннотация @Query

Мы рассматривали запросы, генерируемые из имени метода. Так удобно писать простые запросы. Но если в запросе более 1-2 параметров или несколько join,  то удобнее использовать аннотацию @Query.
Читать далее «Аннотация @Query»

Ключевое слово volatile

Изменение переменной, сделанное в одном потоке, не сразу видно другому потоку. Исправить это можно с помощью volatile — ключевого слова, которое ставится перед переменной. В отличие от слова synchronized, которое применимо для метода или для блока кода, слово volatile применимо только для переменной. volatile — это более слабый вариант синхронизации, который иногда бывает достаточным.
Читать далее «Ключевое слово volatile»