Java Portal | Программирование
Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика Связь: @devmangx РКН: https://clck.ru/3H4WUg
Show more📈 Analytical overview of Telegram channel Java Portal | Программирование
Channel Java Portal | Программирование (@java_iibrary) in the Russian language segment is an active participant. Currently, the community unites 12 127 subscribers, ranking 10 404 in the Technologies & Applications category and 54 512 in the Russia region.
📊 Audience metrics and dynamics
Since its creation on невідомо, the project has demonstrated rapid growth, gathering an audience of 12 127 subscribers.
According to the latest data from 07 June, 2026, the channel demonstrates stable activity. Although there has been a change in the number of participants by -138 over the last 30 days and by 2 over the last 24 hours, overall reach remains high.
- Verification status: Not verified
- Engagement rate (ER): The average audience engagement rate is 11.37%. Within the first 24 hours after publication, content typically collects 6.26% reactions from the total number of subscribers.
- Post reach: On average, each post receives 1 379 views. Within the first day, a publication typically gains 760 views.
- Reactions and interaction: The audience actively supports content: the average number of reactions per post is 4.
- Thematic interests: Content is focused on key topics such as boot, string, void, архитектура, resttemplate.
📝 Description and content policy
The author describes the resource as a platform for expressing subjective opinions:
“Присоединяйтесь к нашему каналу и погрузитесь в мир для Java-разработчика
Связь: @devmangx
РКН: https://clck.ru/3H4WUg”
Thanks to the high frequency of updates (latest data received on 08 June, 2026), the channel maintains relevance and a high level of publication reach. Analytics show that the audience actively interacts with content, making it an important point of influence in the Technologies & Applications category.
🔸Application Architecture Patterns Высокоуровневые схемы структуры систем: - Monolithic architecture - Microservice architecture 🔸 External API Patterns Подходы к проектированию API для сторонних разработчиков: - API Gateway - Backends for Frontend (BFF) 🔸Decomposition Patterns Как разделить большую систему на независимые сервисы: - Decompose by business capability - Decompose by subdomain 🔸Testing Patterns Подходы к проверке корректности микросервисов: - Consumer-driven contract test - Consumer-side contract test - Service component test 🔸Messaging Style Patterns Схемы асинхронного взаимодействия сервисов: - Messaging - Remote Procedure Invocation (RPI) 🔸Security Patterns Решения для аутентификации и авторизации: - Access Token 🔸Reliable Communication Patterns Техники обработки сбоев при взаимодействии сервисов: - Circuit Breaker 🔸Cross-cutting Concerns Patterns Обработка общих функций вроде логирования и метрик: - Externalized Configuration - Microservice Chassis 🔸 Service Discovery Patterns Как сервисы находят друг друга в сети: - 3rd Party Registration - Client-side Discovery - Self-registration - Server-side Discovery 🔸Observability Patterns Как понять, что происходит внутри системы: - Application Metrics - Audit Logging - Distributed Tracing - Exception Tracking - Health Check API - Log Aggregation 🔸Transactional Messaging Patterns Обеспечение согласованности данных между сервисами: - Polling Publisher - Transaction Log Tailing - Transactional Outbox 🔸Deployment Patterns Подходы к безопасному релизу новых версий сервисов: - Deploy as Container - Deploy as VM - Language-specific Packaging - Service Mesh - Serverless Deployment - Sidecar 🔸Data Consistency Patterns Как управлять целостностью данных в распределённых БД: - Saga 🔸Business Logic Design Patterns Как организовать доменную модель и бизнес-логику: - Aggregate - Domain Event - Domain Model - Event Sourcing - Transaction Script 🔸Refactoring to Microservices Patterns Как поэтапно мигрировать монолит в микросервисы: - Transaction Script - Strangler Application 🔸Querying Patterns Как извлекать данные из нескольких сервисов: - API Composition - CQRS (Command Query Responsibility Segregation)Освой эти паттерны и ты поймёшь, как проектировать надёжные, масштабируемые и поддерживаемые системы. 👉 Java Portal
List<Employee> employees = new ArrayList<>();
Map<String, Long> maxMap = new HashMap<>();
for (Employee employee : employees) {
Long maxSalaryForDepartment = maxMap.get(employee.department);
if (maxSalaryForDepartment == null || maxSalaryForDepartment < employee.salary) {
maxMap.put(employee.department, employee.salary);
}
}
Но этот цикл можно записать гораздо короче:
for (Employee employee : employees) {
maxMap.merge(employee.department, employee.salary, Math::max);
}
Метод Map.merge() работает так:
Первый параметр — это ключ, по которому ты хочешь добавить или обновить значение в Map.
Второй параметр — новое значение, которым нужно обновить сохранённое.
Если для этого ключа значение отсутствует (или там null), Map просто сохраняет новое значение.
Третий параметр — это функция. Если в Map уже есть значение для этого ключа, функция вызывается с двумя аргументами: старым и новым значением. То, что вернёт эта функция, и будет записано как новое значение для ключа.
👉 Java PortalList<String> stringList = map.get(key);
if (stringList == null) {
stringList = new ArrayList<String>();
map.put(key, stringList);
}
stringList.add(newElement);
То то же самое можно записать в одну строку:
map.computeIfAbsent(key, k -> new ArrayList<String>()).add(newElement);
А ещё короче так:
map.computeIfAbsent(key, k -> new ArrayList<>()).add(newElement);
Компилятор Java сам поймёт, какой тип ArrayList нужно создать, исходя из типа Map
(в данном случае Map<String, List<String>>).
👉 Java PortalEXISTS для проверки наличия данных; COUNT(*) — только если реально нужен подсчёт.
3. Выбирай конкретные колонки, не пиши SELECT *, чтобы сократить I/O и дать шанс использовать covering-индекс.
4. Пиши sargable-предикаты (которые могут использовать индекс). Медленные коррелированные подзапросы лучше переписать через JOIN или EXISTS.
5. Не лечи ошибки DISTINCT’ом. Исправь логику JOIN и ключи; DISTINCT — только когда реально нужно убрать дубликаты.
6. Фильтруй в WHERE, а HAVING используй только для условий после агрегации.
7. Пиши явные JOIN ... ON, не лепи неявные join’ы через WHERE.
8. Используй keyset pagination вместо OFFSET/LIMIT на больших наборах; для выборки подмножества можно применить TABLESAMPLE (если поддерживается).
9. Предпочитай UNION ALL вместо UNION, если дубликаты допустимы.
10. Заменяй широкие OR на UNION ALL, только если каждая ветка может использовать свой индекс.
11. Тяжёлые запросы запускай вне пиковых часов, при возможности — ограничивай ресурсы или ставь в очередь.
12. Избегай OR в условиях JOIN, можно использовать вычисляемые колонки или UNION ALL, если это позволит использовать индекс.
13. Используй GROUP BY, когда нужны агрегированные строки, и оконные функции — когда нужно видеть строки с агрегатами рядом.
14. Используй временные/derived таблицы, если они реально сокращают работу или добавляют статистику; но помни, что это может заблокировать pushdown-оптимизации.
15. При массовой загрузке данных отключай/удаляй некластерные индексы, вставляй пакетами, потом перестраивай. PK/кластерный индекс можно оставить, если помогает.
16. Используй материализованные представления для редко меняющихся и дорогих агрегатов, продумай их обновление и инвалидацию.
17. Избегай не-sargable сравнений (например, <>) по малоселективным колонкам; лучше перепиши в диапазоны.
18. Минимизируй коррелированные подзапросы на больших выборках, переходи на join’ы или EXISTS.
19. Выбирай INNER или LEFT/RIGHT по смыслу, но помни: INNER JOIN обычно быстрее, если подходит по логике.
20. Кешируй часто повторяющиеся выборки: временные таблицы (на сессию), result cache или материализованные представления с продуманными правилами обновления.
Что такое Query Optimizer
Query Optimizer — это компонент СУБД, который определяет наиболее эффективный способ выполнения SQL-запроса, подбирая оптимальный execution plan.
Он принимает SQL-запрос, парсит его и строит синтаксическое дерево. Затем анализирует дерево, чтобы понять, какие способы выполнения возможны.
Далее оптимизатор генерирует альтернативные execution plans — разные варианты выполнения одного и того же запроса. В каждом плане задаётся:
- порядок доступа к таблицам
- типы соединений
- способы фильтрации и сортировки
Каждому плану присваивается стоимость — оценка по числу чтений с диска, времени CPU и другим факторам.
После этого оптимизатор выбирает план с минимальной стоимостью и использует его для реального выполнения запроса.
Узнай больше
👉 Java PortalМожет ли статический блок выбросить исключение?У тебя есть класс, который инициализирует какой-то критически важный статический ресурс внутри статического блока. В процессе инициализации может произойти ошибка, и выбросится исключение. Что произойдет, если исключение будет выброшено из статического инициализатора? Какую ошибку в итоге выбросит JVM, и в каком состоянии останется класс после этого? Подсказка → Если из статического блока выбрасывается исключение, инициализация класса завершается с ошибкой.
Есть ли в Java концепция выбрасывания исключений конструктором?Ты создаешь класс DatabaseConnection. В конструкторе происходит попытка установить соединение с базой данных, и если это не удается, выбрасывается SQLException. Что произойдет с памятью, выделенной под объект DatabaseConnection, если конструктор выбросит исключение? Можно ли использовать объект после того, как исключение было выброшено? Подсказка → Конструкторы могут (и часто должны) выбрасывать исключения, если объект невозможно создать в корректном состоянии. 👉 Java Portal
server.shutdown=graceful"
server:
shutdown: graceful
spring:
lifecycle:
timeout-per-shutdown-phase: 20s
# Сервер будет завершать работу корректно
# Он даст до 20 секунд на завершение всех запросов и бинов.
Это помогает избежать типичных проблем при остановке сервиса:
- Активные HTTP-запросы обрываются посреди выполнения
- Транзакции в базе откатываются неожиданно
- Потоки прерываются до завершения работы
👉 Java Portalint day = 2;
String result = switch (day) {
case 1 -> "Понедельник";
case 2 -> {
System.out.println("Обработка...");
yield "Вторник"; // значение, которое возвращается
}
default -> "Другой день";
};
yield — не то же самое, что break:
break просто прерывает выполнение;
yield возвращает значение блока в switch, который используется как выражение.
🌟
👉 Java Portal🎙 Серия 1. Функциональные и нефункциональные требования. Как сбор требований помогает создавать надёжные и масштабируемые решения 🎙 Серия 2. Надёжный API. Принципы проектирования API, которые помогут сделать его консистентным, предсказуемым и поддерживаемым 🎙 Серия 3. Крупноблочная архитектура: карта вашей системы. Как выглядит модель на примере Яндекс Календаря и как ребята применяют её для эффективной коммуникации с различными командами разработки 🎙Серия 4. Практика: Рост баз данных: от единиц запросов к тысячам. Как правильно организовать работу с БД, чтобы система оставалась стабильной и эффективной 🎙 Серия 5. Практика. Взаимодействие со смежными системами. Типичные сложности, с которыми сталкиваются команды при интеграции с внешними сервисами, и как их предотвратить или минимизироватьСмотрите проект, чтобы узнать, как создаются одни из крупнейших облачных сервисов в России: ⭐️ Наш сайт ⭐️ VK Видео ⭐️ Ютуб
Available now! Telegram Research 2025 — the year's key insights 
