Библиотека джависта | Java, Spring, Maven, Hibernate
24.9K subscribers
1.86K photos
38 videos
42 files
2.64K links
Все самое полезное для Java-разработчика в одном канале.

Список наших каналов: https://yangx.top/proglibrary/9197

Обратная связь: @proglibrary_feedback_bot

По рекламе: @proglib_adv

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
加入频道
🔼 Оптимизация работы с JDBC в высоконагруженных приложениях

Неэффективное использование JDBC может легко стать узким местом и убить производительность. Вот пошаговый разбор, как сделать работу с JDBC быстрее и стабильнее.

1️⃣ Настраиваем connection pool

Используйте HikariCP, Apache DBCP или C3P0 вместо стандартного DriverManager. Это позволит переиспользовать соединения, а не открывать новое на каждый запрос.

2️⃣ Используем подготовленные запросы (PreparedStatement)

Во-первых, это снижает нагрузку на базу за счёт кеширования плана запроса. Во-вторых, убирает SQL-инъекции на уровне JDBC.

3️⃣ Выбираем правильный тип курсора ResultSet

— TYPE_FORWARD_ONLY, если нужно просто пробежать по данным.
— TYPE_SCROLL_INSENSITIVE позволяет скроллить данные, но требует больше памяти.
— TYPE_SCROLL_SENSITIVE редко нужен, но обновляет данные в реальном времени.

4️⃣ Ограничиваем выборку данных (LIMIT / FETCH FIRST)

Не забирайте сразу всю таблицу – старайтесь выбирать только нужные поля и ограничивать количество строк.

5️⃣ Выключаем автокоммиты

По умолчанию, каждый запрос в JDBC – это отдельная транзакция. Включите setAutoCommit(false) и коммитите изменения пачками, чтобы уменьшить нагрузку.

6️⃣ Логируем медленные запросы

Если какие-то SQL-запросы выполняются слишком долго – используйте SLF4J + P6Spy или встроенные средства логирования в пуле соединений, чтобы их отлавливать.

💬 Какие техники считаете самыми полезными?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
Какой фреймворк для бэка выбрать?

Сколько разработчиков – столько и мнений. Одни не видят альтернативы Spring Boot, несмотря на его "магичность" и прожорливость. Другие кайфуют от Quarkus за его скорость, но не всегда могут убедить бизнес на него перейти. А кто-то вообще пилит микросервисы на Micronaut и радуется жизни.

💬 Всё ещё Spring или пора изучать что-то новое? Пишите ваше мнение в комментариях

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔖 Фишка дебага в IntelliJ IDEA: Reset Frame

Если вам приходилось перезапускать весь дебаг из-за ошибки в анализе кода, есть лучший способ – Reset Frame. Он позволяет откатить выполнение метода и повторить его выполнение с начала, без полной перезагрузки приложения.

▪️ Как использовать


1. Запускаем дебаг и доходим до брейкпоинта.
2. Открываем окно Debug.
3. Во вкладке Frames (стек вызовов) выбираем нужный метод.
4. Нажимаем ПКМ → Reset Frame.
5. Код откатится на вход в метод, как будто вы только что в него зашли.

▪️ Когда это полезно


— Ошиблись при анализе и хотите пересмотреть состояние переменных
— Нужно повторно выполнить метод, не перезапуская весь процесс
— Дебажите рекурсию или сложные цепочки вызовов

⚠️ Важно

— Reset Frame не откатывает глобальные изменения (например, изменения в базе или внешних файлах).
— Он работает только в пределах одного метода – не выйдет вернуть выполнение назад на несколько вызовов.

▪️ Как использовать Reset Frame эффективнее

Можно комбинировать его с Evaluate Expression, чтобы перед повторным вызовом метода изменять переменные вручную.

💬 Пользовались Reset Frame раньше или только узнали?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🏃‍♀️ 40+ каналов, которые должен читать каждый разработчик

Отобрали для вас полезные и проверенные каналы для программистов — в них вы найдете все самое интересное, от технических новостей до практических гайдов.

IT Job Hub | Работа и вакансии в IT — избранные IT-вакансии

Библиотека программиста — новости из мира IT и технологий

Книги для программистов — самые годные книги по любым языкам и стекам

IT-мемы — мемы про жизу айтишника

Proglib Academy — обучение и курсы, чтобы стать топовым специалистом

Азбука айтишника — азы из мира разработки

Библиотека нейросетей — лайфхаки и промпты для разных задач, баттлы нейронок и новости из мира ИИ

Библиотека фронтендера — все о JS, React, Angular и не только

Библиотека мобильного разработчика — лайфхаки и новости из мира Swift и Kotlin

Библиотека хакера — уязвимости, атаки, бэкдоры и как от них защититься

Библиотека тестировщика — самое интересное о том, как крашить код

🦫 Go
Библиотека Go-разработчика
Библиотека задач по Go
Библиотека Go для собеса
Вакансии по Go

#️⃣ C#
Библиотека шарписта
Библиотека задач по C#
Библиотека собеса по C#
Вакансии по C#

🔧 DevOps
Библиотека devops’а
Библиотека задач по DevOps
Библиотека собеса по DevOps
Вакансии по DevOps & SRE

🐘 PHP
Библиотека пхпшника
Библиотека задач по PHP
Библиотека PHP для собеса
Вакансии по PHP, Symfony, Laravel

🐍 Python
Библиотека питониста
Библиотека Python для собеса
Библиотека задач по Python
Вакансии по питону, Django, Flask

☕️ Java
Библиотека джависта
Библиотека задач по Java
Библиотека Java для собеса
Вакансии по Java

📊 Data Science
Библиотека дата-сайентиста
Библиотека задач по Data Science
Библиотека Data Science для собеса
Вакансии по Data Science

🎮 C++
Библиотека C/C++ разработчика
Библиотека задач по C++
Библиотека C++ для собеса
Вакансии по C++

Подписывайтесь на интересные вам каналы и сохраняйте пост в закладки, чтобы не потерять 🔑
Please open Telegram to view this post
VIEW IN TELEGRAM
🛠 Как внедрить CI/CD: 10 самых важных шагов

CI/CD — это ключ к быстрой, качественной и безопасной разработке ПО. Наш гайд поможет вам настроить эффективный пайплайн, автоматизировать рутину и ускорить релизы.

➡️ Что внутри статьи

▪️ Лучшие практики работы с Git
▪️ Автоматизация сборки и тестирования
▪️ Внедрение автоматизированного тестирования
▪️ Эффективное управление зависимостями
▪️ Автоматизированный деплой без простоя
▪️ Настройка мониторинга и логирования

📎 Читайте гайд

Азбука айтишника
Please open Telegram to view this post
VIEW IN TELEGRAM
🎉 Поздравляем с 8 марта

Сегодня отмечаем вклад девушек-разработчиков, аналитиков, тестировщиков, тимлидов и всех, кто влюблён в код. Без вас IT не было бы таким, каким мы его знаем. С праздником, коллеги 💐

Женщины оставили огромный след в истории IT. Если вам кажется, что программирование — это исключительно «мужская территория», взгляните, вот лишь несколько легендарных женщин:

🔹 Ада Лавлейс — автор первой компьютерной программы ещё в 19 веке.
🔹 Грейс Хоппер — создала первый компилятор и популяризировала термин «баг».
🔹 Барбара Лисков — её принцип Liskov Substitution является основой ООП, в том числе в Java.
🔹 Эдит Кларк — первая женщина-инженер, внесшая вклад в вычислительные методы в энергетике.
🔹 Маргарет Гамильтон — разработала софт для посадки «Аполлона-11» на Луну.

А это только малая часть. В статье собраны ещё больше вдохновляющих историй.

🔗 Подробнее в статье

🐸 Библиотека джависта
Please open Telegram to view this post
VIEW IN TELEGRAM
🆕 Java Digest: что нового в мире Java

🔹 JEP-ы в фокусе:


Автонастройка хипа для Serial GC. Теперь JVM сама решает, сколько памяти нужно вашему приложению.
AOT-оптимизации. Меньше возни с кэшем, JVM научилась готовить его сама.
Cooperative JFR Sampling. Профилирование без лишних тормозов.

🔹 Релизы:

— JDK 24 (Build 36) и JDK 25 (Build 9): свежие сборки, багрепорты приветствуются.
— Hibernate ORM 7.0.0 (Beta 4): новая Jakarta Persistence 3.2 и прокачанный анализ моделей.
— Quarkus 3.18.2: фиксы и поддержка последних обновлений зависимостей.
— Micronaut 4.7.5: улучшения в безопасности, валидации и Kafka.

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
Что такое Serial Garbage Collector?

Serial GC — это однопоточный сборщик мусора, работающий по принципу "Stop-the-World". Он останавливает выполнение всех потоков во время сборки мусора и использует копирующий алгоритм для молодых поколений (Young Gen) и компактирующий алгоритм для старших (Old Gen).

🔹 Как работает

1️⃣ В молодом поколении (Minor GC) используется копирующая стратегия: выжившие объекты перемещаются из Eden в Survivor, а из Survivor в Old Gen.
2️⃣ В старом поколении (Major GC / Full GC) выполняется уплотнение памяти для уменьшения фрагментации.
3️⃣ Так как GC работает в одном потоке, во время сборки остановка приложения неизбежна.

🔹 Когда использовать

В одноядерных системах или при ограниченных ресурсах, где многопоточный GC создаст больше нагрузки.
В маленьких JVM (до 1-2 ГБ памяти), где G1 или Parallel GC будут избыточны.
В приложениях без жестких требований к паузам, например, в небольших утилитах или CLI-инструментах.
Please open Telegram to view this post
VIEW IN TELEGRAM
👀 Переживёте ли вы Skynet?

Кто-то считает, что вежливость — базовый навык общения даже с машиной. Кто-то уверен, что железяке безразличны ваши манеры.

Пишете ли вы "Спасибо" и "Пожалуйста" AI? Что в целом думаете на этот счёт?

💬 Делитесь вашим мнением в комментариях.

🐸 Библиотека джависта #междусобойчик
Please open Telegram to view this post
VIEW IN TELEGRAM
🔝 Java наступает Python на пятки

Java захватывает территорию Python на поле искусственного интеллекта — и в корпоративном секторе сопротивление может оказаться бесполезным, считают опрошенные порталом The New Stack эксперты.​

Саймон Риттер, заместитель технического директора компании Azul Systems, утверждает, что 2025-й может стать последним годом господства Python в сфере ИИ. По его словам, исследования показывают, что в течение ближайших 18 месяцев Java может обогнать Python в разработке ИИ-приложений.​

💬 Что думаете, есть ли у Python шансы?

🔗 Подробнее в статье

🐸 Библиотека джависта #свежак
Please open Telegram to view this post
VIEW IN TELEGRAM
⚙️ Как корректно работать с @Transactional в Spring

Аннотация @Transactional — мощный инструмент, но ее неправильное использование может привести к незаметным, но критическим ошибкам: потерянные данные, неожиданные откаты или вовсе отсутствие транзакции. Разбираем частые ошибки и их решения.

@Transactional в том же классе

Если вызываете транзакционный метод внутри того же класса (this.method()), Spring-прокси не срабатывает, и транзакция не создается.
@Service
public class OrderService {

@Transactional
public void createOrder() {
saveOrder(); // Вызов внутреннего метода - транзакция НЕ создается!
}

private void saveOrder() {
// Сохранение заказа
}
}


— Решение: вынести метод в другой Spring-бин.

@Transactional в private-методах

Spring AOP работает через прокси, а прокси не видит private-методы. В результате @Transactional в таких методах просто игнорируется.
@Transactional
private void saveData() { // Транзакция НЕ будет работать!
repository.save(entity);
}


— Решение: метод должен быть public и вызываться через другой Spring-бин

Неправильный выбор Propagation

Уровень распространения (propagation) определяет, как транзакция будет вести себя относительно уже существующих транзакций. Выбор значения по умолчанию (REQUIRED) подходит в большинстве случаев, но в сложных сценариях важно понимать, как работают другие варианты:

— REQUIRED использует текущую транзакцию, если она есть, иначе создаёт новую.
— REQUIRES_NEW всегда создаёт новую транзакцию, независимо от текущей (может привести к неожиданным коммитам).
— NESTED создаёт вложенную транзакцию, которая откатывается отдельно от родительской.
— SUPPORTS использует существующую транзакцию, но не требует её (если транзакции нет, работает без неё).
— NOT_SUPPORTED выполняет код вне транзакции, даже если она уже существует.
— NEVER гарантирует, что код выполняется только вне транзакции, иначе выбрасывает исключение.
— MANDATORY требует, чтобы код выполнялся внутри уже существующей транзакции, иначе выбрасывает исключение.

Откат только по CheckedException

Spring по умолчанию откатывает транзакции только при RuntimeException, а CheckedException (например, SQLException) его не прерывает. Однако изменение этого поведения требует осторожности.
@Transactional
public void updateUser() throws IOException { // CheckedException не откатит транзакцию!
userRepository.save(user);
throw new IOException("Ошибка ввода-вывода");
}


— Решение: указать rollbackFor = Exception.class, если хотите откатывать и CheckedException.

@Transactional в контроллере

Spring сначала коммитит транзакцию, а потом отправляет HTTP-ответ. Если после коммита возникнет ошибка (например, сеть упала), клиент может получить 500, но изменения уже сохранены.

— Решение: транзакции должны быть в сервисах, а не в контроллерах.

💬 Какие проблемы с @Transactional встречались в практике?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📝 Структуры данных: ТОП-30 вопросов и ответов для собеседований в 2025 году

Техническое собеседование на позицию разработчика, дата-сайентиста и ML-инженера часто включает вопросы по структурам данных и связанным с ними алгоритмами.

В нашей статье мы рассмотрим базовые и продвинутые темы, разберем типичные задачи и обсудим оптимальные способы их решения.

📄 Прочитайте статью и укрепите свои знания https://proglib.io/sh/1uYAygzIxr

Библиотека питониста
👑 Магия IntelliJ IDEA

Все знают Ctrl + Alt + L (форматирование кода), но мало кто знает это сочетание:

Ctrl + Alt + Shift + L → Гибкое форматирование

🔹 Зачем это нужно


— Позволяет выбрать, что именно форматировать: весь файл, выделенный код или даже только измененные строки.
— Можно отключить автоформатирование аннотаций, импортов или пробелов, если не хотите, чтобы IDEA ломала ваш стиль.
— Полезно, если работаете в команде с жесткими code style правилами, можно форматировать только нужные части, не трогая остальной код.

🔹 Дополнительные трюки

— Выделите код, затем Ctrl + Alt + Shift + L, чтобы форматировать только его.
— Используйте Settings → Editor → Code Style, чтобы настроить форматирование под себя.

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
📊 Чек-лист: эффективная работа с многопоточностью

Держите под рукой этот чек-лист, чтобы избежать проблем с многопоточностью и повысить производительность кода:

🔹 Синхронизация


✓ Избегайте synchronized для долгих операций
✓ Используйте ReentrantLock для гибкой блокировки
✓ Следите за возможностью deadlock

🔹 Исполнители (Executors)

✓ FixedThreadPool подходит, когда количество потоков заранее известно и ограничено
✓ CachedThreadPool динамически создает потоки, но может привести к их неконтролируемому росту
✓ ForkJoinPool для задач, разбиваемых на подзадачи

🔹 Коллекции и очереди

✓ ConcurrentHashMap потокобезопасная альтернатива HashMap, но не подходит для сценариев с частыми изменениями
✓ BlockingQueue для потокобезопасных очередей
✓ CopyOnWriteArrayList хорош при редких изменениях списка, но ⚠️ медленный при частых модификациях (из-за копирования)

🔹 Работа с Future & CompletableFuture

✓ Используйте CompletableFuture для асинхронных операций вместо Future
✓ thenApply() и thenCompose() позволяют строить цепочки вызовов без блокировки
✓ exceptionally() для обработка ошибок без использования try-catch в коде

Автоматизируйте проверку кода с помощью FindBugs, SonarQube и Checkstyle.

💬 Какие задачи на проекте решаете с помощью многопоточки?

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🔍 Что посмотреть: что нового в Java 24?

Хотите узнать, какие фичи принесёт релиз Java 24 и как они повлияют на вашу разработку? Тогда это видео — must-watch 🎥

Никола Поллок, разработчик Java в Oracle, рассказывает о самых свежих изменениях в экосистеме Java:
— AOT-компиляция
— Виртуальные потоки
— Новые API для работы с байт-кодом и потоками
— GGC и ZGC

Лекция поможет быть в курсе последних трендов и нововведений Java, которые помогут оптимизировать код, улучшить производительность и использовать новые инструменты на полную.

🔗 Смотреть видео

🐸 Библиотека джависта #буст
Please open Telegram to view this post
VIEW IN TELEGRAM
🐧 Пингвин, покоривший мир: история взлета Linux – ОС, управляющей 96% серверов

В 1991 году на компьютере с 4 мегабайтами памяти родилась программа, которая сегодня управляет большей частью интернета, смартфонами и даже космическими аппаратами. Это история Linux, рассказанная одним из первых свидетелей.

➡️ Читать статью
➡️ Зеркало