Библиотека джависта | Java, Spring, Maven, Hibernate
Все самое полезное для Java-разработчика в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Для обратной связи: @proglibrary_feeedback_bot По рекламе: @proglib_adv РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
显示更多📈 Telegram 频道 Библиотека джависта | Java, Spring, Maven, Hibernate 的分析概览
频道 Библиотека джависта | Java, Spring, Maven, Hibernate (@javaproglib) 俄语 语言赛道中的 是活跃参与者。目前社区聚集了 22 431 名订阅者,在 技术与应用 类别中位列第 6 056,并在 俄罗斯 地区排名第 30 006 位。
📊 受众指标与增长动态
自 невідомо 创建以来,项目保持高速增长,吸引了 22 431 名订阅者。
根据 10 六月, 2026 的最新数据,频道保持稳定运转。过去 30 天订阅人数变化为 -83,过去 24 小时变化为 -4,整体触达仍然可观。
- 认证状态: 未认证
- 互动率 (ER): 平均受众互动率为 8.56%。内容发布后 24 小时内通常能获得 4.99% 的反应,占订阅者总量。
- 帖子覆盖: 每篇帖子平均可获得 1 921 次浏览,首日通常累积 1 120 次浏览。
- 互动与反馈: 受众积极参与,单帖平均反应数为 13。
- 主题关注点: 内容集中在 джависта, навигация, jooq, corejava, hibernate 等核心主题上。
📝 描述与内容策略
作者将该频道定位为表达主观观点的平台:
“Все самое полезное для Java-разработчика в одном канале.
Список наших каналов: https://t.me/proglibrary/9197
Для обратной связи: @proglibrary_feeedback_bot
По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4”
凭借高频更新(最新数据采集于 11 六月, 2026),频道始终保持新鲜度与高覆盖。分析显示受众积极互动,使其成为 技术与应用 类别中的关键影响点。
数据加载中...
| 日期 | 订阅者增长 | 提及 | 频道 | |
| 11 六月 | 0 | |||
| 10 六月 | +2 | |||
| 09 六月 | 0 | |||
| 08 六月 | +1 | |||
| 07 六月 | +1 | |||
| 06 六月 | +5 | |||
| 05 六月 | 0 | |||
| 04 六月 | +5 | |||
| 03 六月 | +3 | |||
| 02 六月 | +4 | |||
| 01 六月 | +5 |
| 2 | @TransactionalEventListener с фазой AFTER_COMMIT. Транзакция откатилась. Что произойдёт с событием? | 1 000 |
| 3 | Collectors.toMap падает там, где HashMap.put молчит
Привычка к map.put() подводит при переходе на стримы:
Map<String, User> byEmail = users.stream()
.collect(Collectors.toMap(User::email, u -> u));
Здесь две мины:
1. Дубликаты ключей → `IllegalStateException`. Map.put тихо перезаписал бы значение, а toMap без merge-функции бросает «Duplicate key». Фикс — третий аргумент:
.collect(Collectors.toMap(User::email, u -> u, (a, b) -> b)); // оставить последний
2. `null` в значении → `NullPointerException`. Под капотом toMap использует Map.merge, который по контракту не допускает null-значение. HashMap сам по себе null-значения разрешает — поэтому баг ловится не на ровной коллекции, а на «редких» данных в проде:
.collect(Collectors.toMap(User::email, User::nickname)); // nickname == null -> NPE
Если значение может быть null — собирай вручную в HashMap через forEach/reduce или фильтруй заранее. Стоит держать в голове: toMap строже, чем тот Map, который он создаёт.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava | 1 |
| 4 | 🤫 Тихое отключение батчинга инсертов
Выставил hibernate.jdbc.batch_size, ждёшь один батч на 100 строк, а в логах 100 отдельных INSERT. Если ID у сущности такой:
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
…то батчинг не работает в принципе. Из официальной доки Hibernate: insert-батчинг на уровне JDBC прозрачно отключается при использовании identity-генератора.
Причина в стратегии write-behind. С IDENTITY сгенерированный ID известен только после выполнения INSERT (через getGeneratedKeys()). А значит Hibernate обязан выполнить вставку немедленно при persist(), и накопить пачку для одного батча уже не может.
Решение — SEQUENCE с оптимизатором pooled / pooled-lo: он резервирует диапазон значений в памяти (одна выборка из последовательности на N строк), ID известен заранее, write-behind и батчинг включаются:
@Id
@GeneratedValue(strategy = GenerationType.SEQUENCE, generator = "seq")
@SequenceGenerator(name = "seq", allocationSize = 50)
private Long id;
MySQL SEQUENCE не имеет, там IDENTITY часто единственный вариант, и батчинг приходится вытягивать отдельными трюками (rewriteBatchedStatements=true + ручные приёмы).
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava | 1 304 |
| 5 | 🐸Библиотека джависта
#DevLife | 1 408 |
| 6 | 🤫 Признайтесь: у вас в проде до сих пор крутится Spring Boot 2.7?
Если послушать конференции и треды на Хабре, то кажется, что весь мир давно переехал на 3.x, а кто не успел, тот прямо сейчас домигрирует.
Только в курилке инженеры говорят другое.
На самом деле огромная часть систем спокойно живёт на 2.7. Прод работает, инциденты не сыпятся, бизнес доволен. Просто вслух об этом говорить почему-то неловко, будто старая версия фреймворка автоматически делает тебя «неаккуратным инженером».
Статья без морализаторства разбирает то, о чём не всегда говорят:
— почему javax → jakarta — это только входной билет, а не сама миграция;
— почему «там просто версию поднять» ломается ровно в тот момент, когда Hibernate начинает генерить чуть-чуть другой SQL;
— почему security-кейс — единственный аргумент, который стабильно проходит приоритизацию;
— и чем на самом деле вы платите, оставаясь на 2.7 (спойлер: не стабильностью, а отсрочкой).
🔗 Читай подробнее
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#CoreJava | 1 469 |
| 7 | 🔥 Инженерная методичка по ИИ от Романа Барлоса (Team Lead в Yandex Cloud)
Продолжаем делиться экспертизой команды курса «Разработка ИИ-агентов».
Роман собрал мастхев-инструменты и ключевые работы для тех, кто хочет выйти за рамки вайбкодинга.
🛠️ Полезные инструменты:
• Understand Anything — граф знаний по коду и зависимостям.
• DeepTutor — open-source платформа для персонализированного обучения.
• Superpowers — набор практик для системной разработки с ИИ.
• Awesome Agent Skills — коллекция навыков для ИИ-агентов.
📚 Ключевые работы по LLM:
• Attention Is All You Need (2017) — архитектура Transformer.
• GPT-1 (2018) — начало эпохи GPT.
• GPT-2 (2019) — решение новых задач без дообучения.
• GPT-3 (2020) — обучение на примерах из запроса.
• InstructGPT (2022) — RLHF и современные чат-боты.
На курсе Роман выступает консультантом программы: помогает формировать содержание уроков с опорой на актуальные инженерные практики».
Занять свое место на потоке:
👉 Курс «Разработка ИИ-агентов» | 1 436 |
| 8 | ⚡️ Магия curl
Нужно скачать файл и продолжить загрузку после обрыва? curl -C - автоматически продолжит с того места, где остановился — не нужно качать заново.
🔹 Зачем это нужно
— Загрузка больших файлов через нестабильное соединение.
— Автоматически определяет размер уже скачанной части и продолжает.
— Работает с HTTP, FTP и даже SFTP.
🔹 Как использовать
— Скачать с возможностью продолжения: curl -C - -O https://example.com/dump.sql.gz
— С прогресс-баром: curl -C - -# -O https://example.com/large-file.tar.gz
— Ограничить скорость: curl --limit-rate 10M -O https://example.com/file.iso
— В конкретный файл: curl -C - -o backup.tar.gz https://example.com/backup
— С авторизацией: curl -C - -u user:pass -O https://repo.example.com/artifact.jar
💡 Заверни в цикл для автоматического ретрая: while ! curl -C - -O https://example.com/dump.sql.gz; do sleep 5; done — скрипт будет пытаться докачать, пока не получится.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 1 546 |
| 9 | 🐸Библиотека джависта
#DevLife | 1 580 |
| 10 | ⚡️ Apache Fory — 4.3k ⭐️
Стандартная Java-сериализация медленная и жирная по байтам. Берёшь Kryo → лучше, но возишься с регистрацией классов и тюнингом.
Apache Fory (бывший Fury, переименовали в 2025-м) — это сериализация, которая делает и то, и другое. Генерит сериализаторы в рантайме через JIT, использует zero-copy и даёт до 170x против JDK-сериализации. IDL не нужен:
import org.apache.fory.Fory;
import org.apache.fory.config.Language;
Fory fory = Fory.builder()
.withLanguage(Language.JAVA)
.requireClassRegistration(true)
.build();
fory.register(Order.class);
byte[] bytes = fory.serialize(order);
Order copy = (Order) fory.deserialize(bytes);
Это drop-in замена JDK / Kryo / Hessian — со 100% совместимым API (writeObject/readObject, Externalizable и т.д.), только в разы быстрее. Корректно тащит shared- и циклические ссылки, умеет schema evolution (можно добавлять/удалять поля независимо на двух концах), поддерживает GraalVM native image через AOT без рефлексии. А режим xlang сериализует один и тот же объект между Java, Python, C++, Go, Rust, JS, Scala, Kotlin и TypeScript.
Идеален для высоконагруженного RPC, кэшей, передачи данных между сервисами и кросс-язычных пайплайнов, где сериализация — это узкое место.
📱 Репозиторий
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 1 680 |
| 11 | 😎 Знакомьтесь с экспертом Proglib.academy: Senior Software Engineer и Team Lead в Yandex Cloud Роман Барлос
Роман — консультант нашего курса «Разработка ИИ-агентов». Он работает на стыке cloud-native архитектуры и AI, активно внедряя современные ИИ-подходы в реальные процессы разработки.
За что его ценит IT-комьюнити?
🟣 Team Lead и AI-евангелист в команде UX Yandex Cloud
14-лет в разработке. Занимается AI-адопшеном в команде Yandex Cloud, проводит мастер-классы и продвигает лучшие практики для повышения эффективности разработчиков.
🟣 Техлид Sourcecraft Code Assistant
С сильным практическим бэкграундом принимал участие как технический лид в создании мощного AI-расширения для VS Code.
🟣 Создатель полезного Open Source
Разрабатывает утилиты, которые позволяют быстро начать эксперименты с инференсом и агентами в локальном окружении: например, набор скриптов vllm-setup для быстрого запуска окружения и mini-proxy — минималистичный прокси для OpenAI API провайдеров.
🟣 Автор интерактивных ML-визуализаций
Объясняет сложные концепции наглядно. Создал серию залипательных обучающих материалов, где можно вживую пощупать работу сетей Хопфилда, машин Больцмана и VC-размерности.
Роман регулярно делится инженерными наработками, инсайтами и экспертизой в своем авторском Telegram-канале
На курсе Роман выступает консультантом программы: он помогает формировать содержание уроков с опорой на актуальные инженерные практики и жесткие требования индустрии.
Узнать больше о программе и разработке автономных систем:
👉 Курс «Разработка ИИ-агентов»
Так, продолжаем знакомить вас с командой?
👍 — Да, ждем новых лиц
🔥 — Жду полезные материалы от Романа | 1 539 |
| 12 | ✔️ Spring-тест: идемпотентность платёжного эндпоинта
Напишите защиту от двойного списания 👇
📦 Задание
Клиент при сетевом таймауте повторяет POST /payments и списание проходит дважды. Реализуйте идемпотентность по заголовку Idempotency-Key.
@PostMapping("/payments")
public PaymentResult pay(
@RequestHeader("Idempotency-Key") String key,
@RequestBody PaymentRequest request) {
// Ваша реализация
}
📋 Требования
— Повторный запрос с тем же ключом возвращает результат первого вызова и НЕ выполняет списание заново.
— Разные ключи → разные операции.
— Конкурентные запросы с одним ключом (двойной клик / параллельные ретраи) не должны привести к двойному выполнению.
— Ключ хранится с TTL (например, 24 часа).
Ставьте → 🔥, если нравится формат. Если нет → 🌚
💬 Решения под спойлер. Сравним, какое будет лучше.
🐸 Библиотека собеса по Java
#practise | 1 425 |
| 13 | 🐸Библиотека джависта
#DevLife | 1 804 |
| 14 | 👩💻 Руководство по Git
Подробная документацию по Git на русском языке. От базовых команд до продвинутых тем вроде pack-файлов, переменных окружения и внутреннего устройства Git.
Подойдёт и новичкам и тем, кто хочет глубже понимать, как Git работает под капотом.
🔗 Подробнее
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 1 972 |
| 15 | ⚡️ Продолжаем знакомить вас с экспертами курса AgentOps!
— Сергей Нотевский расскажет, как выстроить FinOps для AI-продуктов: оптимизировать затраты на разработку и продакшен, внедрить model routing, semantic cache и систему алертов для контроля расходов
— Эмиль Сатаев разберет Context Engineering: управление контекстом, защиту от prompt injection, работу с длинными контекстами и построение безопасного пайплайна входа для AI-систем
— Михаил Бондаревский покажет, как подготовить инфраструктуру для AI-агентов: Docker, sandboxing, streaming, docker-compose и воспроизводимое окружение для разработки и продакшена
— Мурат Хажгериев расскажет про Enterprise Integrations & MCP: когда MCP действительно нужен, как подключать внешние сервисы и реализовывать интеграции с OAuth2 delegation
— Герман Сабиров разберет Governance & Compliance для AI-систем: data flow, audit logs, требования 152-ФЗ, локализацию данных и построение compliance-подхода на уровне архитектуры
Курс для backend-разработчиков, тимлидов и LLM инженеров о том, как внедрять AI-логику в бэкенд IT-продуктов и сохранять стабильность сервиса.
👉 Изучить обновленную программу AgentOps и занять место. | 2 181 |
| 16 | 🏛 ArchUnit — 3.7k ⭐️
Кто-то дёрнул репозиторий прямо из контроллера «по-быстрому», ревьюер не заметил — и слои потекли. Документация в Confluence про это не в курсе.
ArchUnit превращает архитектурные правила в обычные unit-тесты. Он читает байткод твоих классов и проверяет зависимости, а значит, нарушение падает прямо в CI, как любой другой красный тест:
import com.tngtech.archunit.core.importer.ClassFileImporter;
import com.tngtech.archunit.lang.ArchRule;
import static com.tngtech.archunit.lang.syntax.ArchRuleDefinition.classes;
@Test
void controllers_must_not_touch_repositories() {
var imported = new ClassFileImporter().importPackages("com.myapp");
ArchRule rule = classes()
.that().resideInAPackage("..controller..")
.should().onlyDependOnClassesThat()
.resideOutsideOfPackage("..repository..");
rule.check(imported);
}
🔹 Из коробки:
→ проверка слоёв (layered) и onion-архитектуры одним fluent-вызовом;
→ поиск циклических зависимостей между пакетами;
→ контроль неймингов и аннотаций.
Работает с любым тест-фреймворком — JUnit, TestNG, без разницы. Для легаси есть «заморозка»: фиксируешь текущие нарушения как baseline и блокируешь только новые, разгребая старые постепенно. Можно даже задавать правила PlantUML-диаграммой и проверять код на соответствие картинке.
Версия 1.4.2, поддержка вплоть до Java 26. Идеален, когда в команде больше трёх человек и архитектуру хочется не объяснять на словах, а зафиксировать в коде.
📱 Репозиторий
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 1 969 |
| 17 | 🐸Библиотека джависта
#DevLife | 1 858 |
| 18 | ⚙️ HikariCP в проде: пять настроек, которые часто крутят неправильно
Пул соединений в Spring Boot работает «из коробки», поэтому в application.properties обычно либо пусто, либо строчка про размер пула. И всё хорошо ровно до первого пика, когда в логах начинает мелькать Connection is not available, request timed out after 30000ms, а сервис уходит в полупаралич: не падает, но и не работает.
Разбираем параметры, которые чаще всего настроены не так.
1️⃣ maximumPoolSize: «больше» ≠ «лучше»
Классика — поставить 100 «на всякий, у нас тысяча юзеров онлайн». Но каждый коннекшн к Postgres — это процесс на стороне БД, память, контекст транзакции. 100 параллельных запросов от одного бэкенда — это не параллельность, а очередь: CPU и диск всё равно одни.
Формула из pool sizing guide самого HikariCP: connections = (core_count * 2) + effective_spindle_count
Для 8 ядер + SSD это ~17 коннекшенов. И помни про реплики: 5 подов по 20 = 100 коннекшенов к одной базе только от этого сервиса, а у Postgres max_connections обычно 100–200. Перешагнул → FATAL: sorry, too many clients already.
Прежде чем раздувать пул, загляни в pg_stat_activity. В 9 из 10 случаев там медленные запросы без индекса, idle in transaction или локи. Больше коннекшенов = больше параллельных медленных запросов.
2️⃣ minimumIdle = maximumPoolSize, а не половине
Туториалы любят min-idle: 5 / max: 20 → «в холостом держим 5, в пик расширяемся». Звучит экономно, а на деле каждый новый коннекшн — это TCP + TLS + auth + инициализация сессии = 30–100 мс сверху на первые запросы при расширении. Спайк на старте дня → красивый пик p99 → ложный инцидент.
HikariCP проектировался как фиксированный пул. Дефолт minimumIdle == maximumPoolSize, и автор прямо просит не трогать. Хочешь экономить — уменьшай maximumPoolSize, а не разноси его с minimumIdle.
3️⃣ maxLifetime: всегда меньше любого внешнего таймаута
Дефолт 30 минут. Проблема: если что-то в инфраструктуре закроет коннекшн раньше, чем HikariCP его «состарит», ловишь Connection is closed.
А закрыть может многое:
▪️ AWS NLB — idle TCP через 350 сек
▪️ AWS ALB — 60 сек
▪️ корпоративный фаервол — 5–15 мин, без логов
▪️ PgBouncer server_idle_timeout — 600 сек
▪️ Postgres idle_in_transaction_session_timeout — нередко 10 мин
Ставь с запасом 30–60 сек меньше самого короткого внешнего таймаута. Не видишь внешних таймаутов — 300000 (5 мин) разумный дефолт.
4️⃣ keepaliveTime: чтобы коннекшн не протух в idle
Дефолт 0 → выключено. В средах с агрессивным conntrack или короткими idle-таймаутами файрвола соединение тихо рвётся, и следующий клиент получает Broken pipe / Connection reset на первом же запросе.
Включаешь — и HikariCP раз в N мс гоняет SELECT 1 по простаивающим коннекшенам.
spring.datasource.hikari:
keepalive-time: 30000 # 30 сек
max-lifetime: 300000 # keepalive ОБЯЗАТЕЛЬНО меньше
Минимум — 30 сек, меньше HikariCP проигнорит. Нагрузка копеечная: 20 коннекшенов = 40 пингов в минуту.
5️⃣ connectionTimeout: это твой SLA
Дефолт 30 сек — почти всегда абсурд. Если API должно отвечать за 500 мс, клиент через 30 сек уже давно получил 504 от ingress. А бэкенд продолжает копить запросы, потоки висят в ожидании коннекшна, сервис застревает на минуты.
Лучше fail fast:
spring.datasource.hikari.connection-timeout: 2000 # 2 сек
Пул исчерпан → быстрый 503, очередь не растёт, алерт срабатывает сразу. Сверху можно навесить circuit breaker (Resilience4j).
⚠️ И отдельно про Actuator: /actuator/health/db дёргает базу. При исчерпанном пуле он тоже встаёт в очередь → DOWN → k8s liveness рестартит под → нагрузка переезжает на соседей → каскад. Лечится коротким connectionTimeout + liveness, который не трогает базу вообще.
И главное помни: HikariCP — это просто пул. Если в сервисе медленные запросы без индексов, ни твики таймаутов, ни раздувание пула не помогут — получишь больше параллельных медленных запросов, и база встанет ещё быстрее. Сначала pg_stat_activity, pg_stat_statements, EXPLAIN ANALYZE — потом настройка пула.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 1 936 |
| 19 | @Scheduled(fixedRate = 5000) — предыдущее выполнение заняло 8 секунд. Когда запустится следующее? | 1 982 |
| 20 | 🐳 Магия Docker Compose
Поменяли конфиг одного сервиса и не хотите перезапускать весь стек из 10 контейнеров? docker compose up -d --no-deps service-name пересоздаст только указанный сервис.
🔹 Зачем это нужно
— Перезапуск одного сервиса вместо всего стека экономит минуты на тяжёлых проектах.
— --no-deps не трогает зависимости, так что БД и Redis останутся на месте.
— -d запускает в фоне, терминал свободен для другой работы.
🔹 Как использовать
— Пересоздать один сервис: docker compose up -d --no-deps api
— Пересобрать и запустить: docker compose up -d --no-deps --build api
— Посмотреть логи только одного: docker compose logs -f api
— Рестарт без пересоздания: docker compose restart api
— Масштабировать: docker compose up -d --scale worker=3
💡 restart не подхватывает изменения в docker-compose.yml или Dockerfile, для этого нужен up -d. Если обновили env-переменные или порты — только up -d применит изменения.
══════ Навигация ══════
Вакансии • Задачи • Собесы
🐸 Библиотека джависта
#Enterprise | 2 164 |
现已上线!2025 年 Telegram 研究 — 年度关键洞察 
