Два backend-разработчика решали одну и ту же задачу.
Вариант A:
Вариант B:
Какой запрос отправится в прод?
Многие выбирают B, потому что он выглядит надёжнее. Пользователь может ввести
Но есть нюанс.
В большинстве СУБД вызов
На 100 строках разницы не видно.
На 10 миллионах пользователей разница становится очень заметной.
Поэтому в проде обычно используют один из вариантов:
• хранить email в нормализованном виде (например, всегда lowercase);
• использовать case-insensitive collation;
• создать функциональный индекс на
Самая опасная часть запроса часто выглядит как самая безобидная.
👉 Java Portal
Вариант A:
SELECT *
FROM users
WHERE email = ?
Вариант B:
SELECT *
FROM users
WHERE LOWER(email) = LOWER(?)
Какой запрос отправится в прод?
Многие выбирают B, потому что он выглядит надёжнее. Пользователь может ввести
John@Example.com, а в базе лежит john@example.com.Но есть нюанс.
В большинстве СУБД вызов
LOWER() над колонкой ломает использование обычного индекса. Вместо быстрого Index Seek база часто уходит в полный скан таблицы.На 100 строках разницы не видно.
На 10 миллионах пользователей разница становится очень заметной.
Поэтому в проде обычно используют один из вариантов:
• хранить email в нормализованном виде (например, всегда lowercase);
• использовать case-insensitive collation;
• создать функциональный индекс на
LOWER(email).Самая опасная часть запроса часто выглядит как самая безобидная.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13❤2
Spring Boot 4.1 получит поддержку ленивого получения JDBC-соединений
DataSource будет оборачиваться в🔥
https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.1.0-RC1-Release-Notes
👉 Java Portal
DataSource будет оборачиваться в
LazyConnectionDataSourceProxy, а физическое соединение из пула станет запрашиваться только в тот момент, когда приложению действительно потребуется выполнить JDBC-запрос. https://github.com/spring-projects/spring-boot/wiki/Spring-Boot-4.1.0-RC1-Release-Notes
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
Spring Boot 4.1.0 RC1 Release Notes
Spring Boot helps you to create Spring-powered, production-grade applications and services with absolute minimum fuss. - spring-projects/spring-boot
🤯4
Лучшие практики Spring Boot REST API
Часть 1: Реализация API Get Collection
Часть 2: Реализация API Create и Update
Часть 3: Реализация FindById и DeleteById API
Часть 4: Обработка исключений в REST API
👉 Java Portal
Часть 1: Реализация API Get Collection
Часть 2: Реализация API Create и Update
Часть 3: Реализация FindById и DeleteById API
Часть 4: Обработка исключений в REST API
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
💡 Java: Используйте default-методы в интерфейсах для сохранения обратной совместимости (начиная с Java 8).
Если добавить новый default-метод в интерфейс, существующие реализации не придётся менять. Они автоматически получат реализацию по умолчанию.
#Java #Interfaces
👉 Java Portal
Если добавить новый default-метод в интерфейс, существующие реализации не придётся менять. Они автоматически получат реализацию по умолчанию.
#Java #Interfaces
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4❤1
Java: По возможности не возвращайте из методов изменяемые внутренние коллекции, чтобы:
Не раскрывать внутреннее состояние объекта, повышая безопасность.
Иметь возможность менять реализацию без риска сломать другие части приложения.
#Java #JavaDev
👉 Java Portal
Не раскрывать внутреннее состояние объекта, повышая безопасность.
Иметь возможность менять реализацию без риска сломать другие части приложения.
#Java #JavaDev
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7
Вышла статья о распространённых случаях, когда
Поскольку такие ситуации встречаются во фреймворках, библиотеках и обычных приложениях, материал будет полезен разработчикам всех этих типов проектов.🤝
Разбираются причины использования рефлексии для изменения
https://inside.java/2026/04/27/avoiding-final-field-mutation/
👉 Java Portal
final-поля изменяются через рефлексию, и какие альтернативы можно использовать вместо этого.Поскольку такие ситуации встречаются во фреймворках, библиотеках и обычных приложениях, материал будет полезен разработчикам всех этих типов проектов.
Разбираются причины использования рефлексии для изменения
final-полей, связанные проблемы и варианты миграции на более безопасные решения.https://inside.java/2026/04/27/avoiding-final-field-mutation/
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4
Java: Используйте блоки
👉 Java Portal
try-catch только там, где это действительно необходимо. Не применяйте исключения для управления логикой выполнения программы. #Java #BestPracticesPlease open Telegram to view this post
VIEW IN TELEGRAM
❤4
В PostgreSQL 19 Beta 1 завезли
Теперь можно попытаться вставить запись, а если она уже есть — сразу получить существующую.
Похоже, атомарный get-or-create наконец добрался до PostgreSQL.
#PostgreSQL #SQL
👉 Java Portal
ON CONFLICT DO SELECT.Теперь можно попытаться вставить запись, а если она уже есть — сразу получить существующую.
Похоже, атомарный get-or-create наконец добрался до PostgreSQL.
#PostgreSQL #SQL
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍2
Stream Gatherers официально стали финальной частью Java 24 (JEP 485).
Stream API существует ещё со времён Java 8, но набор промежуточных операций всегда был ограничен методами вроде
Вместо того чтобы постоянно расширять стандартный API новыми операциями, Java теперь позволяет разработчикам создавать собственные.
Что дают Stream Gatherers:
• Используются через метод
• Позволяют реализовать собственную логику через интерфейс
• Работают как обычные промежуточные операции Stream API
• Были доступны в Preview в Java 22 и Java 23
• Стали финальными в Java 24 без изменений API
Например, теперь можно написать собственный gatherer для фильтрации строк по длине, оконной обработки данных, дедупликации или других сценариев, которые раньше требовали сложных цепочек операций или кастомных решений вне Stream API.
👉 Java Portal
Stream API существует ещё со времён Java 8, но набор промежуточных операций всегда был ограничен методами вроде
filter(), map() и sorted().Вместо того чтобы постоянно расширять стандартный API новыми операциями, Java теперь позволяет разработчикам создавать собственные.
Что дают Stream Gatherers:
• Используются через метод
gather() для любого стрима• Позволяют реализовать собственную логику через интерфейс
Gatherer• Работают как обычные промежуточные операции Stream API
• Были доступны в Preview в Java 22 и Java 23
• Стали финальными в Java 24 без изменений API
Например, теперь можно написать собственный gatherer для фильтрации строк по длине, оконной обработки данных, дедупликации или других сценариев, которые раньше требовали сложных цепочек операций или кастомных решений вне Stream API.
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥5
Команда «docker run -it»
Когда контейнеру Docker необходимо запустить интерактивное приложение, такое как оболочка, языковая REPL или текстовый редактор, команде «docker run» требуются два дополнительных флага: -i и -t.
👉 Java Portal
Когда контейнеру Docker необходимо запустить интерактивное приложение, такое как оболочка, языковая REPL или текстовый редактор, команде «docker run» требуются два дополнительных флага: -i и -t.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍1
Java: Не делай поля публичными. Держи их
👉 Java Portal
private и используй геттеры/сеттеры для инкапсуляции. #Java #OOPPlease open Telegram to view this post
VIEW IN TELEGRAM
👍5
This media is not supported in your browser
VIEW IN TELEGRAM
Вот забавный ресурс для изучения HTTP-кодов через мемы: 200, 404, 500 и компании. Отличный способ запомнить коды без скучных таблиц.
→ https://github.com/keijeizei/httpmemes
👉 Java Portal
→ https://github.com/keijeizei/httpmemes
Please open Telegram to view this post
VIEW IN TELEGRAM
😁7💊3❤1
Почему многопоточность — это сложно?
Многопоточность объединяет сразу несколько непростых концепций.
▪️ Concurrency (конкурентное выполнение)
Несколько задач выполняются одновременно или создают видимость одновременного выполнения. Из-за этого порядок выполнения становится непредсказуемым.
▪️ Synchronization (синхронизация)
Нужна для защиты общих данных от одновременного изменения несколькими потоками. Без неё возникают race condition, повреждение данных и трудноуловимые баги.
▪️ Coordination (координация)
Потоки часто зависят друг от друга. Нужно управлять порядком выполнения задач, ожиданием результатов и обменом данными между потоками.
▪️ Visibility (видимость изменений)
Один поток должен видеть изменения, которые внесли другие потоки. Из-за кэшей процессора, оптимизаций компилятора и переупорядочивания инструкций это происходит не всегда автоматически.
Именно сочетание этих проблем делает многопоточность сложной. Программа может работать правильно тысячу раз подряд и сломаться на тысяча первом запуске из-за другого порядка выполнения потоков.
👉 Java Portal
Многопоточность объединяет сразу несколько непростых концепций.
Несколько задач выполняются одновременно или создают видимость одновременного выполнения. Из-за этого порядок выполнения становится непредсказуемым.
Нужна для защиты общих данных от одновременного изменения несколькими потоками. Без неё возникают race condition, повреждение данных и трудноуловимые баги.
Потоки часто зависят друг от друга. Нужно управлять порядком выполнения задач, ожиданием результатов и обменом данными между потоками.
Один поток должен видеть изменения, которые внесли другие потоки. Из-за кэшей процессора, оптимизаций компилятора и переупорядочивания инструкций это происходит не всегда автоматически.
Именно сочетание этих проблем делает многопоточность сложной. Программа может работать правильно тысячу раз подряд и сломаться на тысяча первом запуске из-за другого порядка выполнения потоков.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2
This media is not supported in your browser
VIEW IN TELEGRAM
Твой бэкенд теперь умеет говорить.
Вышла open-source платформа: AI-агент подключается через MCP, сам находит ошибку и предлагает фикс, пока ты смотришь не на тот дашборд.
Неделю назад это был твой таск.
Называется Maple.
https://github.com/Makisuo/maple
👉 Java Portal
Вышла open-source платформа: AI-агент подключается через MCP, сам находит ошибку и предлагает фикс, пока ты смотришь не на тот дашборд.
Неделю назад это был твой таск.
Называется Maple.
https://github.com/Makisuo/maple
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
image_2026-06-14_11-48-52.png
1.4 MB
Сегодняшняя концепция: Consistent Hashing (согласованное хеширование)
Обычное хеширование:
Добавили 1 сервер
↓
Почти все ключи перераспределяются
Согласованное хеширование:
Добавили 1 сервер
↓
Перемещаются только ключи, находящиеся рядом с ним
Эта простая идея лежит в основе таких систем, как:
• Redis Cluster
• Apache Cassandra
• Amazon DynamoDB
• Memcached
Одна из самых важных концепций, на которых строятся масштабируемые распределённые системы.
👉 Java Portal
Обычное хеширование:
Добавили 1 сервер
↓
Почти все ключи перераспределяются
Согласованное хеширование:
Добавили 1 сервер
↓
Перемещаются только ключи, находящиеся рядом с ним
Эта простая идея лежит в основе таких систем, как:
• Redis Cluster
• Apache Cassandra
• Amazon DynamoDB
• Memcached
Одна из самых важных концепций, на которых строятся масштабируемые распределённые системы.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍4
💡 Java: Ловите ошибки ещё на этапе компиляции, помечая переопределённые методы аннотацией
👉 Java Portal
@Override. #Java #Annotations// ❌ Опечатка в имени метода — код компилируется,
// но вы НЕ переопределили toString()
public class User {
private final String name;
public User(String name) {
this.name = name;
}
public String toStrng() { // хотели toString()
return name;
}
}
// Баг остаётся незамеченным — println(user)
// не будет использовать ваш метод
// ✅ @Override превращает опечатку в ошибку компиляции
public class User {
private final String name;
public User(String name) {
this.name = name;
}
@Override
public String toString() {
return "User(" + name + ")";
}
}
// @Override
// public String toStrng() { ... }
//
// Ошибка компиляции:
// method does not override or implement a method from a supertype
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2
Circuit Breaker — это паттерн отказоустойчивости, который предотвращает постоянные попытки выполнить операцию, если она с высокой вероятностью завершится ошибкой.
В этом подробном руководстве Джессика показывает, как реализовать собственный Circuit Breaker в Spring Boot.
Из статьи ты узнаешь:
- зачем нужны Circuit Breaker;
- как обеспечиваются гарантии конкурентного доступа и переходов между состояниями;
- как отслеживать и учитывать ошибки;
- как устроена логика срабатывания Circuit Breaker;
- и многое другое.
Источник: https://freecodecamp.org/news/how-to-build-your-own-circuit-breaker-in-spring-boot-and-really-understand-resilience4j/
👉 Java Portal
В этом подробном руководстве Джессика показывает, как реализовать собственный Circuit Breaker в Spring Boot.
Из статьи ты узнаешь:
- зачем нужны Circuit Breaker;
- как обеспечиваются гарантии конкурентного доступа и переходов между состояниями;
- как отслеживать и учитывать ошибки;
- как устроена логика срабатывания Circuit Breaker;
- и многое другое.
Источник: https://freecodecamp.org/news/how-to-build-your-own-circuit-breaker-in-spring-boot-and-really-understand-resilience4j/
Please open Telegram to view this post
VIEW IN TELEGRAM
freeCodeCamp.org
How to Build Your Own Circuit Breaker in Spring Boot – and Really Understand Resilience4j
This article explains how to design and implement your own circuit breaker in Spring Boot using explicit failure tracking, a scheduler-driven recovery model, and clear state transitions. Instead of relying solely on Resilience4j, we’ll walk through t...
👍5
До сих пор вручную собираешь шаблон проекта каждый раз, когда начинаешь что-то новое?
Я недавно наткнулся на Better-Fullstack — генератор, который помогает быстро поднять основу приложения и не тратить время на однотипную настройку.
Что умеет:
1️⃣ Поддерживает четыре основных экосистемы: TypeScript, Rust, Python и Go.
2️⃣ Более 270 комбинаций технологий, которые можно свободно комбинировать.
3️⃣ Позволяет выбрать фронтенд, бэкенд, базу данных, аутентификацию, платежи, AI-интеграции и DevOps-компоненты в одном месте.
4️⃣ Автоматически генерирует готовый каркас проекта, который можно использовать сразу после создания.
Главная польза не столько в экономии времени, сколько в том, что тебе не приходится снова и снова заниматься настройкой окружения. Вместо этого можно сосредоточиться на бизнес-логике и функциональности продукта.
Подойдёт для соло-разработчиков, команд с типовыми стек-требованиями и проектов с жёсткими сроками.
GitHub: https://github.com/Marve10s/Better-Fullstack
👉 Java Portal
Я недавно наткнулся на Better-Fullstack — генератор, который помогает быстро поднять основу приложения и не тратить время на однотипную настройку.
Что умеет:
1️⃣ Поддерживает четыре основных экосистемы: TypeScript, Rust, Python и Go.
2️⃣ Более 270 комбинаций технологий, которые можно свободно комбинировать.
3️⃣ Позволяет выбрать фронтенд, бэкенд, базу данных, аутентификацию, платежи, AI-интеграции и DevOps-компоненты в одном месте.
4️⃣ Автоматически генерирует готовый каркас проекта, который можно использовать сразу после создания.
Главная польза не столько в экономии времени, сколько в том, что тебе не приходится снова и снова заниматься настройкой окружения. Вместо этого можно сосредоточиться на бизнес-логике и функциональности продукта.
Подойдёт для соло-разработчиков, команд с типовыми стек-требованиями и проектов с жёсткими сроками.
GitHub: https://github.com/Marve10s/Better-Fullstack
Please open Telegram to view this post
VIEW IN TELEGRAM
GitHub
GitHub - Marve10s/Better-Fullstack: Scaffold production-ready full-stack apps in TypeScript, Rust, Python, Go, and Java with a…
Scaffold production-ready full-stack apps in TypeScript, Rust, Python, Go, and Java with a visual builder and CLI. Choose your frontend, backend, database, auth, AI, payments, and DevOps integratio...
💊4
💡 Совет по Java: всегда закрывайте ресурсы вроде
👉 Java Portal
BufferedReader, InputStream и OutputStream через try-with-resources, чтобы избежать утечек памяти и ресурсов. #Java #BestPracticesPlease open Telegram to view this post
VIEW IN TELEGRAM